D 的个人博客

开源程序员,自由职业者

小而美的 Java 博客系统 Solo
Golang 在线 IDE Wide
黑客与画家的社区 Sym
  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 集群增加整体容量。