Dendrite项目从Kafka迁移到NATS

22-10-06 banq

Matrix 是建立在分布式数据结构之上的实时通信联合协议,Dendrite是一个按照微服务架构建立的Matrix家庭服务器的实现。

我们使用 Kafka 作为在微服务组件之间分发事件和异步任务的一种手段。除了能够根据需要进行扩展和缩减之外,我们还需要消息队列中的持久性,以确保在重新启动部分服务时不会丢失任何任务或事件。

但我们最终发现,当它被用于一个完整的polylith微服务部署时,它是相对沉重的,并且没有像我们希望的那样为较小的部署进行扩展。

我们评估了许多不同的替代方案,最终选择了NATS JetStream,它实际上给了我们所有使用Kafka的功能,但也有一些额外的好处。首先,它很容易运行。NATS服务器消耗的系统资源要少得多。由于是用Go编写的,我们能够将NATS嵌入到我们自己的单片机风格的二进制文件中,所以在那些较小的部署中,我们甚至不需要一个单独的服务器实例。
我们提供了一些补丁,使其有可能在进程中与NATS服务器进行通信,而不使用外部套接字;这使得它有可能轻松地针对移动设备,并在WebAssembly下冒险进入Web浏览器。

NATS的好处与Kafka相比。

  • 消耗更少的系统资源 - 比Kafka更少的基础设施支出
  • 用Go语言编写 - 易于嵌入,不需要像Kafka那样单独的服务器实例
  • 更简单的数据保留 - 使用JetStream,比Kafka更容易管理和配置保留。
  • 减少管理开销 - 与Kafka相比,开发人员更容易管理和维护
  • 降低代码库的复杂性--由于消除了复杂的持久化存储要求,代码栈更简单


对我们来说,切换到JetStream是一种转变。总体而言,性能非常好。我们大量使用了基于兴趣的保留政策,以确保工作完成后被清理掉。我们利用能够手动确认项目的优势,确保它们在清理之前被成功处理。我们已经能够成功地管理来自NATS流的工人池,并大大减少了我们代码库中一些不再需要自己持久性存储的地方的复杂性。我们甚至已经成功地在iOS和Android上的应用嵌入场景中运行,作为我们点对点演示的一部分。