基于事件的微服务:带 Broker 的 MQTT 还是带 API GATEWAY 的 HTTP?

Event-based-microservices: MQTT with Broker OR HTTP with API GATEWAY?

我正在尝试使用微服务开发一个项目。

我有一些关于这个主题的问题(有些不清楚):

1)如何实现微服务通信?

A) HTTP:每个微服务公开 HTTP API,一个 API 网关广播请求。

B) MQTT:每个微服务 pub/sub 到代理

C) 两者:但是如何理解一个比另一个更好?

即使对于通常通过 HTTP 执行的经典操作,我是否也必须使用 pub/sub 协议作为标准?例如我有两个微服务: 网络管理产品服务web-management 是一个允许管理员在其电子商务数字商店中添加、修改...产品的面板。假设我们要实现 createProduct 操作。是命令(根据事件/命令区分),一对一的通信

我可以在产品服务中打开一个 API,比方说 (POST, "/product") 添加新产品。我还可以在 productCreationRequest 事件中实现此转换命令。在这种情况下:web-managemnet 发布此事件。 product-service 监听 productCreationRequest 事件(以及 productUpdateRequest、productGetEvents,...)一旦收到通知,它就会执行操作并发出 productCreated 事件。

我发现这种情况处于临界状态。例如,last-occasion-service 可能会收听 productCreated 并立即向客户发送消息(电子邮件或推送通知)。您如何看待这个用例?

2) 这可能是一个有效的代理(我将使用 docker-compose 或 kubernetes 来编排容器化微服务:可能采用的语言 java、javascript、python)?

考虑为 Javascript/Node.js 使用 SMF 框架,它有助于原型 pub/sub 通过开箱即用的微服务之间的消息代理 (RabbitMQ) 通信:

https://medium.com/@krawa76/bootstrap-node-js-microservice-stack-4a348db38e51

至于消息代理路由,请使用事件驱动的命名约定,例如post a "web.new-product",其中 "web" 是子系统名称,"new-product" - 事件名称。

两者都有可能!选择一个允许您轻松混合和匹配 HTTP(同步)通信和更多异步事件驱动 pub/sub 的代理。它应该允许您根据需要在两个选项之间迁移微服务。

HTTP APIs 在分布式应用程序的边缘非常有用,客户想要提交订单或其他东西,阻止 等待响应( 200 好)。

但在微服务之间的应用程序内部,很多微服务不需要响应...异步,最终一致。使用 pub/sub(如 MQTT)可以轻松地支持多个下游消费者。 MQTT 的另一个重要用途是将更新流式传输给下游消费者...例如来自公共汽车或航空公司或其他公司的数据馈送,而不必 轮询 REST API更新。

对于您的用例和类似的用例,我几乎总是建议使用 pub/sub 通信,即使今天它是与单个后端进程的简单请求-回复交互。 REST over HTTP 是点对点的,也许将来您希望另一个进程能够 see/consume/monitor 该事件或交互。如果您已经在使用发布-订阅,则添加该数据流的第二个(或更多)消费者是微不足道的。 REST/HTTP.

更难

就性能而言,我非常怀疑像 HTTP 这样的阻塞协议是否会优于异步和双向协议,例如使用 WebSockets 进行网络通信的 MQTT。

至于将所有这些粘合在一起的代理,请查看标准版 Solace PubSub+ 事件代理...可以同时执行(并在两者之间转换)MQTT 和 HTTP。我还写了一个CodeLab for this (almost) exact use case哈哈!

(顺便说一句,我为 Solace 工作!仅供参考。)