IPC 微服务 AMQP 和弹性

问题描述

我正在为我在 Kubernetes 上运行的微服务平台创建架构。 我目前的架构看起来像:

Current Architecture

说明:

  • 我使用 Flask 创建 API RESTful。
  • 对于我的 IPC 机制和事件驱动,我使用 RabbitMQ。
  • 微服务包含用于调用生产者和消费者 RabbitMQ 的代码
  • 当 Flask 应用程序启动时,消费者在子进程中被实例化(使用多处理库)。在主应用程序(flask)的所有存活状态期间,进程不会被加入,也不会被杀死。
  • 仅在调用请求 (POST/PUT) 时才会实例化生产者。

我想知道,如果我的 RabbitMQ 崩溃了怎么办:

  • 微服务中的消费者将不再存活,因为它会引发连接rabbitMQ的异常
  • 微服务 API (FLASK) 将继续存在

所以我的问题如下:
将消费者进程分离到一个独立的容器中是一个好习惯吗?

-> 容器将在同一个 pod 中与主应用程序一起运行。
-> sidecar 消费者会有一个 liveness 端点,所以如果 RabbitMQ 再次崩溃,Kubernetes 将只启动这个容器。
-> sidecar 消费者将有权访问数据库以写入事件。
-> 生产者可以留在主应用(flask),对我来说更有弹性。

这样做是否正确?

Next Architecture

解决方法

是的,我认为这是一个很好的方法,因为您依靠 Kubernetes 来检查该容器是否已启动(使用活性探测器),而不是从应用程序中执行此操作。

您还可以使用集群的可观察性堆栈来监控/提醒此类事件(已关闭的容器)。