D 的个人博客

全职做开源,自由职业者

  menu

即时消息协议预研

选取了主流的四种即时消息协议作为预研对象,分别描述了这四种消息技术的原理、适用场景以及限制。

 

XMPP

XMPP(The Extensible Messaging and Presence Protocol,可扩展的消息通讯与呈现协议),前身是开源即时消息协议 Jabber,现在已经被 IETF 标准化(RFC 3920)。

应用非常广泛,可选择的实现很多,Openfire 是目前比较成熟的。

XMPP

 

SIMPLE

SIMPLE(SIP for Instant Messaging and Presence Leveraging Extensions,基于 SIP 的即时消息与呈现扩展),IBM/微软主推的即时消息协议,虽然 Java 有相关 JSRs(164、165)定义了接口,但没有找到适合的实现。

SIMPLE

各实体功能如下:

  • Presence Service:接收、存储和分发 presence information。Presence Service 既可以是一个物理实体上的 server,也可以只是 presentity 和 watcher 之间的直接通信。在具体实现中前者比较常见,后者是 P2P 的模式
  • Presentity:用于提供 presence information 给 Presence Service
  • Watcher:向 Presence Service 请求获取 Presentity 的 presence information 或者自身的 watcher information
  • Principal:指单个的人、程序或者设备,也可以是人、程序、设备的集合体。对于 Presence Service 来说,各个 Principal 是不同的
  • Presence User Agent:为 Principal 提供手段来操作 0 个或者多个 Presentity,Principal 操作 Presence User Agent 改变 Presentity 的状态。是 Principal 和 Presentity 交互的 interface
  • Watcher User Agent:类似 Presence User Agent,Principal 通过其来操作 0 个或多个 Watcher,Watcher 收到 Presentity 的新状态之后也通过 Watcher User Agent 呈现给 Principal
  • Presence Protocol:定义了 Presentity 和 Presence Service,Watcher 和 Presence Service 之间交换消息的一组标准
  • 在具体的实现中最常见的是把 Presence Service 实现为一个 Presence Server,Presence User Agent 和 Presentity 组合在一起,Watcher 和 Watcher User Agent 组合在一起,由一个终端来同时支持这两种组合体,这样,一个终端就既能订阅别人的也能发布自己的 presence information

IRC

IRC(Internet Relay Chat,互联网中继聊天协议),以服务器中转为原理进行消息转发,机制成熟稳定,应用广泛,可选择的实现较多。

IRC

A作为客户端连接到了服务器 S1 的 ChannelX 频道,B 作为客户端连接到了服务器 S2 的 ChannelX 频道,此时 A 发消息后通过 S1 转发给 S2,然后 S2 有把消息发送给了 B。

其中频道是一个广播组,用户可以进入频道,也可以离开频道。当一个用户在频道里发消息时,频道里的其他所有用户都能够收到该消息。当第一个用户进入频道,频道被创建,当最后一个用户离开此频道时,频道被销毁。

在 IRC 服务器网络中,频道由这些服务器共同维护,频道相当于一条通信管道,将所有开通此项频道的服务器贯穿起来,消息在这个管道中流通。

PSYC

PSYC(Protocol for SYnchronous Conferencing,同步会话协议),设计用来取代 IRC,兼容 IRC/XMPP 客户端,据称其可以无限扩容,弥补 IRC/XMPP 中使用 s2s 后服务器网络拓扑膨胀时性能急剧下降的缺陷。

比较新,应用较少,可选择的实现较少。http://about.psyc.eu/Comparison

结论

可选择 XMPP 作为即时消息底层支持协议,Openfire 作为实现。

在单机 Openfire 不能满足用户数时可考虑使用 Openfire Connection Manager 模块增加客户端连接数;配置 Openfire 集群增加整体容量。