【问题标题】:Looking For A Scalable PubSub Solution Or Alternative寻找可扩展的 PubSub 解决方案或替代方案
【发布时间】:2016-06-04 07:38:46
【问题描述】:
我目前正在为我正在尝试构建的 IM 应用程序寻找最佳架构。
该应用由频道组成,每个频道都有数千名订阅用户。每个用户一次只能订阅一个频道,并且能够从该频道发布和阅读。用户可以在频道之间快速移动。
我最初考虑使用 XMPP PubSub(通过 Ejabbered 或 MongooseIM),但据我了解,它是事后才添加的,而且可扩展性不强。
我也考虑过使用像 AMPQ 这样的消息队列协议,但我不确定这是否是我从 IM 方面寻找的内容。
我对 XMPP PubSub 的担忧是否合理?如果是这样,您知道更好的解决方案吗?
【问题讨论】:
标签:
performance
xmpp
message
scalability
publish-subscribe
【解决方案2】:
我根据您的输入设想了上述 IM 应用程序的主要用例。
**
**
- 许多新用户不断在系统中注册并订阅一个
的频道
- 许多现有用户将其订阅从一个频道更改为
其他频道
- 许多现有用户不断向频道发布消息
- 许多现有用户继续以订阅者的身份接收消息
XMPP 非常适合第 3 和第 4 用例。 “ejabbered”是经过验证的高度可扩展平台之一。
万一第二个用例,你可能有这样的逻辑。
- a) 更新数据库中用户的频道信息
- b)让他收听新频道
- c) 将他的发布主题更改为其他频道...等等
当您需要执行多个操作时,我强烈建议使用“KAFKA”以异步方式执行上述操作
在第一个用例的情况下,通过rest APIs提供注册。这样注册可以从任何设备完成。注册用户时,你可能有很多操作如下。
- 1) 在数据库中注册用户
- 2) 创建内部 IM 帐户
- 3) 发送电子邮件或短信确认...等等
这里还执行第一个操作作为其余 API 服务逻辑的一部分。使用 KAFKA 以异步方式执行第 2 和第 3 操作。这意味着您的服务逻辑以同步方式执行第一个操作并向 KAFKA 引发事件。每个消费者将以异步方式处理第 2 次和第 3 次操作。
如果所有层/子系统都可以很好地扩展,系统可以很好地扩展。从这个角度来看,Below tech stack 可能会帮助您更好地扩展。
REST APIS + KAFKA + EJABBERED(XMPP)