微服务网络中的 ejabberd

ejabberd in a microservice network

我愿意在微服务网络中使用ejabberd / mongooseIm。除了 REST API 网络之外,XMPP 应该是我们的聊天协议。我想将在 xmpp 服务器下游传入的消息发送到工作服务。有没有人这样做或可以引导我走向正确的方向?

我的第一个想法是使用 RabbitMQ 将新传入的消息发送给工作人员。

基本上有两种选择可以让您的员工访问由 ejabberd / MongooseIM 路由的消息。我将专注于 MongooseIM,因为我更了解它(免责声明:我在开发团队中)。

首先是以异步/轮询方式扫描邮件存档。如果您愿意编写序列化模块,Message Archive Management describes XMPP level protocol for accessing it, but for your use case the important part is message persistence - so just making sure the relevant module (mod_mam) is enabled in server config and the messages will hit the database. The databases supported for MAM are PostgreSQL and Riak, though there was also some work on a Cassandra backend (YMMV). This doesn't require tinkering with the server / in Erlang for as long as there's a DB driver for your language of choice available. Since PR#657 可以将消息存储为原始 XML 甚至某种自定义格式。

第二个选项是使用hooks and handlers的服务器机制(在ejabberd中也可用),它可以触发服务器对"user sent a message"、"user logged in"、"user logged out", ... 然而,这需要用 Erlang 编写的服务器端扩展。在最简单的情况下,扩展可以通过 AMQP 转发任何有趣的事件(带有消息内容和元数据),或者只是调用一些外部 HTTP/REST API - 这样真正的工作由工作人员执行,为您提供关于实现语言的自由。此选项也不需要启用 mod_mam 或设置消息持久性数据库(您仍然可以使用持久性消息队列...)。

总的来说,这个想法是完全可行的。

通常,用于为机器对机器、物联网、微服务等构建消息传递系统的最常见 XMPP 扩展是 PubSub,如 XEP-0060 中所定义。

这是一个您可以在 ejabberd 中启用的模块。它基于 API,因此您甚至可以根据您的应用程序自定义该模块的行为。

Pubsub 基本上允许分离发送者和接收者,并且是专门为该用例设计的。