【发布时间】:2019-12-08 01:04:00
【问题描述】:
我知道消息传递系统是非阻塞和可扩展的,应该在微服务环境中使用。
我质疑的用例是:
假设有一个管理仪表板客户端负责发送 API 请求以创建 Item 对象。有一个微服务提供 API 端点,该端点使用 MySQL 数据库来存储项目。还有另一个微服务使用弹性搜索来进行文本搜索。
这个管理仪表板客户端应该:
A.发送 2 个 API 调用; 1 调用 MySQL 服务和另一个 elasticsearch 服务
或
B.向主题发送消息以供 MySQL 服务和 elasticsearch 服务使用?
考虑 A 或 B 的优缺点是什么?
我认为当只有 2 个微服务在使用这个主题时,这有点矫枉过正。此外,管理员创建 Item 对象的频率非常小。
【问题讨论】:
-
选择第二种方法,因为队列有自己的专业人士,而且它们具有容错性,因此您的消息不会丢失。
-
选项 C:您可以将事务写入数据库,然后使用 CDC 将事件读取到 Kafka 主题,然后写入 Elasticsearch
-
@robot_alien 方法 A,两个服务都需要启动,并且发布新项目将在 mysql 和 es 中同步。因此,方法 A 也不会丢失任何消息,但我知道它将服务紧密耦合在一起......这听起来很糟糕,但我认为它适合这种情况?
-
@cricket_007 我也考虑到了这一点,我查找了一个名为 monstache 的工具,它可以在 mongodb 和 elasticsearch 中同步数据,但我不知道,与仅向每个人发送一个 post api 调用相比,它似乎有点矫枉过正女士?
-
在这种情况下没有对错,但更好的方法。你已经回答了你的问题。方法 B 是可扩展的和非阻塞的,并且将来可以添加更多服务。方法 A 只是更好的单体。但是在(任何)服务失败的情况下,方法 B 将不起作用。真的取决于你。 .在方法 A 如果您的任何依赖服务出现故障,您将推迟请求并最终超时。方法 A 存在依赖关系,因此我们不能称它们为真正的微服务
标签: rest apache-kafka microservices message-queue messaging