【问题标题】:Refreshing microservice data with event messages使用事件消息刷新微服务数据
【发布时间】:2021-01-10 22:04:31
【问题描述】:

我正在开发一个微服务架构,我们正在其中添加基于事件的更新,例如

  1. 用户在 UI 中更新域对象
  2. UI 将消息更新发送到管理该域对象的微服务 A。
  3. 微服务 A 将向 Kafka 主题发布更新消息。该消息将是更新的域对象的 ID,以及操作,例如放置/发布/删除。
  4. 消费者微服务 B、C 等将侦听此主题,然后必须使用 ID 调用适当的域对象端点来检索更新的数据。

我想知道如何解决的问题是第 4 步。我们计划在 Kafka 消息中放置一个枚举,以标识更新的对象类型,因为微服务 A 处理了一些类似类型的域对象,这些域对象可以被更新。消费者将根据此类型调用适当的端点。

我认为这并不太好,因为每个消费者都必须进行此检查并调用端点。有什么更好的方法推荐吗?

谢谢

【问题讨论】:

    标签: rest apache-kafka microservices messaging


    【解决方案1】:

    在微服务架构中,每个服务都拥有自己的数据,没有其他服务可以直接与其他服务的数据库对话。

    在您的情况下,如果 A 修改了 A 拥有的域对象并且 B、C 等需要这些详细信息,那么 B、C 服务必须调用 A 的 API 来获取该数据。他们不能直接与 A 的数据库对话。 B 和 C 不应复制或复制各自数据库上的数据,因为这会破坏微服务架构的优势。

    通常,B 和 C 需要该域模型的一些属性子集,理想情况下,这些属性应该通过消息负载作为事件通过 Kafka 主题传递。

    例如,如果 A 维护客户数据,而 B 需要客户地址和信用额度,则 A 应通过事件将客户地址和信用额度传递给 B。如果 B 需要访问完整的客户数据,则 B 应调用 Rest API在 A 上获取这些详细信息。

    【讨论】:

    • 感谢您的回复。我不确定的一点是当 B 需要从 A 获取数据时,是否有一种干净的方法让 B 知道要调用哪个端点?我正在考虑在消息中传递一个枚举,它会检查以确定哪个端点,但我认为这不是干净的。
    • 我建议通过 Kafka 事件本身将必要的详细信息从 A 传递到 B,如地址和信用额度示例中所述。这可以节省您从 B 到 A 的额外往返行程,并有助于提高性能。此外,在大多数情况下,这是理想且干净的。您可以根据逻辑配置不同的主题以获取不同的信息/事件。如果您仍然想发送两个事件(A->B),然后通过 REST 端点让 B 查询 A,那么我建议将 URI(不是 URL)放在事件(A->B)本身中。因此,B 会知道要准确调用哪个端点。这也是 HATEOS 所做的。
    • 好的。我认为我们需要采用第二种选择,即由于事件数据的潜在大小,不在事件中发送数据。我还在考虑在事件中添加 URI,以便服务只需要调用它。我能看到的唯一问题是服务如何知道反序列化响应的类型?
    • 1.如果事件数据太大,请验证微服务的边界。数据不应重复,而仅应在服务之间共享某些属性。 2.无论您是通过事件还是通过REST,数据的大小都保持不变。 kafka 的默认最大大小为 1MB。 3. 不过,如果你想做 REST,你可以将事件中的 Content-Type 信息与 URI 一起传递。
    猜你喜欢
    • 2022-10-18
    • 2019-05-11
    • 1970-01-01
    • 2018-05-07
    • 2014-04-26
    • 2020-07-11
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多