导语:本文由Zoosk(一个具有5000万会员的浪漫的社交约会网站)工程副总裁Peter Offringa所写,讲述了Zoosk的实时通信技术。
当我们的会员从Zoosk获得的最有价值的消息时,他们可以实时进行交互。毕竟,每个用户其连接的另一端都可能在未来产生关系。这种情况的兴奋和丰富才能充分实现实时。该套件的Zoosk服务促进这些交互一般被描述为实时通信(RTC)。这些通信交付使用XMPP协议,其他流行的即时通信产品也使用该协议。Zoosk的会员在三个不同的相互作用中体验实时通信:
这些通信目前通过所有主要的Zoosk产品向用户提供。
RTC基础设施
这些RTC服务通过一个高性能和高可扩展性的基于XMPP的基础设施来交付。采用开源Jabber服务器Tigase,是这项聊天服务的核心。Tigase是用Java编写的,并且我们的平台团队已经创建了一些自定义的扩展,来处理Zoosk特定的业务逻辑。
Tigase部署在具有标准的8个CPU,并基于Linux的应用服务器级别的机器上。Tigase服务器在配对集群中配置,通过负载均衡管理的主要和次要节点。所有的连接在一个时间点都被指定到主节点。如果服务查询主服务器失败,负载平衡器将立即开始重新引导用户流量到辅助服务器。
这里有18个成对的集群,每个都在任何时间处理4000到8000个连接。除了套接字(socket)连接传输XMPP流量,Tigase还包括一个通过HTTP连接支持BOSH的服务。
BOSH是我们允许web浏览器浏览Zoosk.com和我们的Facebook应用程序保持一个持久连接到Tigase的协议。我们的桌面应用程序和移动应用程序使用标准的TCP/IP套接字连接。
Tigase服务器通过Tigase和客户端应用程序(web浏览器、移动设备、桌面应用程序)之间的持续连接来实时跟踪用户在线状态。许多核心Zoosk的产品功能,包括搜索结果,概要视图和消息传递,需要确保这种状态是近实时得反映在所有客户端应用程序中。为了保持这种状态的Zoosk基础设施的其余部分相一致,用户在用户数据库中的记录被更新,以反映其当前的在线状态,包括其最新的联机转换的时间戳记。
用户的在线状态也存储在我们的搜索基础设施的缓存上,从而使搜索结果可以将在线状态考虑在内。Zoosk搜索功能由一个SOLR服务器层驱动。我们已经扩展每个SOLR服务器,包括ehcache实例来存储那些目前在线的用户。这个缓存的在线状态通过一个称为在线状态管理器(OSM)的专用的Tigase实例来实时更新。
OSM从主要的Tigase聊天服务器接收自定义的显示用户在线状态的XMPP数据包,然后让一个网络调用来更新ehcache实例的每一个SOLR服务器。在高峰期,大约一分钟内有8000个这样的在线状态转换。保持这种高速缓存以外的SOLR索引允许用户的状态进行实时更新,独立于主站到从站的周期性索引复制快照。用户在线状态将在查询时与查询结果结合起来,过滤还是采纳基于用户当前是否在线。搜索算法更喜欢在线用户,因为这鼓励的实时通信,并为其他用户提供更丰富的体验。
用户交互与核心RTC功能以外的Zoosk服务,也可以触发生成一个实时通知给一个连接用户的业务逻辑。例如,如果其他用户查看我们的个人资料,或接受我们发送的好友请求,我们希望能立即知道该行为。基于PHP的web应用程序将触发异步工作,打开一个网络连接到一个Tigase服务器,并将 XMPP 数据包传递给服务器,通知提供数据的自定义消息负载。该数据包被Tigase处理后,传送到当前连接用户的客户端应用程序。
用户的客户端应用程序处理这个自定义数据包,并给用户显示相应的“提醒”或更新一个“标签”。如果在用户离线时,Tigase将存储数据包,直到用户重新上线。此时,它会将自定义数据包传递到用户的客户端应用程序。
监控和测试
Zoosk的技术运营团队已经建立了许多方法来测试和监控RTC基础设施的运营状况,以确保其响应速度和可用性。这些测试主要从Tigase服务器收集涉及各种机制的性能数据,或模拟真实用户的互动。如果一个特定的健康检查失败或性能数据超出既定的临界值,我们的Nagios安装将发出一个警告。
下一步是什么
展望未来,我们将继续积极探索新的方法来让Zoosk成员充分利用实时体验。我们本月将推出RTC支持我们的移动web应用程序。其他设备或媒介,将让Zoosk应用程序同样被实时连接。随着我们的成员连接到Zoosk应用程序的时间正在快速增加,我们计划提高我们RTC的基础功能,便于成员之间更容易互相发现和交流。
本文来自:High Scalability