我愿意在微服务网络中使用 ejabberd / mongooseIm。除了 REST API 网络,XMPP 应该是我们的聊天协议。我想将在下游 xmpp 服务器传入的消息发送到工作服务。有没有人这样做或可以引导我走向正确的方向?
我的第一个想法是使用 RabbitMQ 将新的传入消息发送给工作人员。
我愿意在微服务网络中使用 ejabberd / mongooseIm。除了 REST API 网络,XMPP 应该是我们的聊天协议。我想将在下游 xmpp 服务器传入的消息发送到工作服务。有没有人这样做或可以引导我走向正确的方向?
我的第一个想法是使用 RabbitMQ 将新的传入消息发送给工作人员。
基本上有两种选择可以让您的工作人员访问由 ejabberd / MongooseIM 路由的消息。我将专注于 MongooseIM,因为我更了解它(免责声明:我在开发团队中)。
第一种是以异步/轮询方式扫描消息存档。消息存档管理描述了用于访问它的XMPP 级别协议,但对于您的用例而言,重要的部分是消息持久性 - 因此只需确保mod_mam
在服务器配置中启用了相关模块 ( ) 并且消息将到达数据库。MAM 支持的数据库是 PostgreSQL 和 Riak,尽管在 Cassandra 后端 (YMMV) 上也有一些工作。只要有适合您选择的语言的数据库驱动程序,这不需要在 Erlang 中修改服务器/。从PR#657开始,如果您愿意编写序列化模块,则可以将消息存储为原始 XML 甚至某些自定义格式。
第二种选择是使用钩子和处理程序的服务器机制(在 ejabberd 中也可用),它可以触发服务器对诸如“用户发送消息”、“用户登录”、“用户注销”等事件的操作。 . 然而,这需要一个用 Erlang 编写的服务器端扩展。在最简单的情况下,扩展可以通过 AMQP 转发任何有趣的事件(带有消息内容和元数据),或者只是调用一些外部 HTTP/REST API - 这样真正的工作由工作人员执行,让您可以自由地使用实现语言. 此选项也不需要启用mod_mam
或设置用于消息持久性的数据库(您仍然可以使用持久消息队列......)。
总的来说,这个想法是完全可行的。
通常,用于为机器对机器、物联网、微服务等构建消息传递系统的最常见 XMPP 扩展是 PubSub,如XEP-0060中所定义。
这是您可以在 ejabberd 中启用的模块。它是基于 API 的,因此您甚至可以根据您的应用程序自定义该模块的行为。
Pubsub 基本上允许将发送者和接收者解耦,并且专为该用例而设计。