消耗了卡夫卡的话题后,发送HTTP响应

问题描述 投票:0回答:2

我目前正在写有一堆微服务的Web应用程序。我目前正在探索如何正确地所有这些服务之间的沟通,我决定坚持使用一个消息总线,或者更具体的Apache卡夫卡。

但是,我有我不知道如何从概念上得到解决的一些问题。我使用的是API网关服务为主体的进入到应用程序。它作为主要的代理转发操作适用的微服务。考虑以下情形:

  1. 用户发送POST请求到API网关与一些信息。
  2. 网关产生一个新的消息,并将其发布到卡夫卡的话题。
  3. 订阅微服务的主题中获得消息并处理数据。

所以,我怎么现在应该从网关响应客户端?如果我需要从微服务的一些数据?感觉就像是HTTP请求可能超时。我应该坚持与客户和API网关之间的替代的WebSockets?

而且,如果客户端发送一个GET请求来获取一些数据,我怎么接近,使用卡夫卡?

谢谢。

javascript node.js apache-kafka microservices backend
2个回答
1
投票

你有一个选项,在网关创造更多的端点?

我将有POST端点专用只是用于生产消息给卡夫卡队列,其中其他微服务会消耗。而从端点返回的对象,它会含有某种参考或ID来获取消息的状态。

而在网关在那里你可以创建时,你得到的信息的参考获取消息的状态创建另一个GET端点。


1
投票

比方说,你要创建一个订单。这是它应该是如何工作的:

  1. 传统上我们曾经有过一个自动增加的字段或序列中的RDBMS表中创建一个订单ID。但是,这意味着没有生成的订单号,直到我们保存DB的顺序。现在,在卡夫卡写入数据时,我们不会立即写入DB和卡夫卡不能生成订单ID。因此,你需要甚至在卡夫卡写订单之前使用一些可扩展的ID生成工具,如Twitter雪花什么用类似的架构,这样就可以生成一个订单id
  2. 一旦你的订单ID,写卡夫卡话题单一事件消息原子(全有或全无)。一旦成功完成,您可以发送回一个成功的响应到客户端。在这个阶段,不要写入多个主题,你会写多个主题失去原子。你总是可以有将事件写入多个其他议题多的消费群体。一个消费群应该写在一些持久DB数据查询
  3. 现在需要解决的读取你自己写即收到成功应答后,立即在用户希望看到的顺序。但您的数据库可能是尚未更新与订单数据。要达致这,写订单数据后,卡夫卡和返回成功响应之前立即写订单数据像Redis的或Memcached的分布式缓存。当用户读取顺序,则返回缓存的数据
  4. 现在,你需要保持与最新的订单状态更新缓存。你总是可以做一个卡夫卡消费者从卡夫卡的主题阅读订单状态
  5. 为了确保您不需要把所有的订单在高速缓存存储器。您可以驱逐基于LRU数据。如果读取命令,数据不在缓存中,它会从数据库中读取和写入缓存为将来的请求
  6. 最后,如果你想确保订购的商品被保留用于顺序,这样没有人可以像预订航班座位,或者一本书的最后一个副本,你需要一个共识算法。您可以使用Apache动物园管理员为关于这一项目的创建distribured锁
© www.soinside.com 2019 - 2024. All rights reserved.