当前位置: 首页 > 知识库问答 >
问题:

使用kafka和键值存储的请求-响应

谷梁玺
2023-03-14

TLDR:有一个请求/响应模式。目前,请求是通过激活队列完成的,响应是通过memcache键值存储完成的(由前端轮询)。出于各种原因,想转移到kafka,想知道我们是否可以重新构建响应路径,以不使用memcach。

我试图理解什么是针对以下问题的最佳实践系统设计。

我们有一个前端,可以生成需要大量处理的请求。应用程序需要响应才能升级。有时,我们需要撤消/后退(这会使您回到以前的状态)。有一组后端可以执行繁重的处理步骤。

在我们当前的设置中,前端将请求推入队列(当前为activemq),后端尽可能处理队列中的项目,并将结果存储在键值存储(memcached)中,其中键是队列中消息的UUID(它本身是唯一会话id非唯一步骤id)。前端正在轮询存储以获取消息的UUID。这样做的好处是前端可能会失去连接/etc,但只要会话id被保留,我们就可以ping键值存储以获得所需的结果。我们有时还需要向后移动/撤消操作,并且可以在键值存储中返回结果(因为每个步骤都有自己的UUID,并且所有UUID都是已知的)。

然而,在未来,我们希望能够至少部分通过队列进行响应,这样我们就可以拥有一些分析工具作为请求和响应的消费者。“最小的改变”是将响应生产者推到队列中,并将memcached作为消费者之一。但也许有更好的办法。我们也在考虑从activemq切换到Kafka,因为这将给我们可重放性(但我们没有Kafka的经验)。

看看Kafka,它看起来像是要获取一条特定的消息,您需要扫描整个分区,有没有更简单的方法来检索特定的消息?我们是否为每个互动序列生成一个主题?如果我们想重播,但不知道偏移量,我们有什么办法(除了浏览很多信息)?我们的负载非常小(每天大约有1百万条消息),所以我想什么都可以,但最好的做法是什么(臭名昭著的,如果我们扩展呢)?

共有1个答案

侯池暝
2023-03-14

正如我理解你的用例,你没有一个有效的方法通过推送向应用程序传递响应,这就是为什么你让应用程序通过id(key)来获取响应。您可以切换出各种组件,例如:ActiveMQ为Kafka,memcache为任何其他KV存储,但最终,如果您的约束是这样的应用程序需要从服务器拉的结果,你将始终不得不消耗异步传输形式的响应,并使它们在服务器上可用。例如,如果您切换到Kafka,您可以在Kafka Streams中将您的消费者实现为[全局]KTable,并以这种方式提供响应,但这仍然只是一个带有额外步骤的KV商店。没有好的方法直接从Kafka主题获得特定的消息/偏移量,这不是它的真正用途。

在不了解更多细节的情况下,将异步传输组件(ActiveMQ、Kakfa等)与服务组件分开似乎是明智的,以便能够分别扩展或交换它们。例如,如果扩展到不再适合单个memcached实例的内存的大小,则可以直接迁移到任意数量的分布式KV存储,如Redis、Couchbase、DynamoDB等。

 类似资料:
  • 我制作了一个用于注册成员的jsp页面,在注册时,如果用户忘记填写表单中的任何字段,另一个页面会显示一条错误消息。 为了实现这一点,我使用了3个servlet,第一个servlet从jsp页面获取值,并传递到第二个servlet,后者检查是否有任何字段为空,如果是,它将返回一条消息给第一个servlet,然后将消息传递给第三个servlet,以向用户显示错误消息。 我的问题是消息没有从第一个serv

  • 我想用kafka流实现请求-响应模式,我使用spring boot kafka,其中添加了一些数据作为报头,命名为关联id,但是当kafka流API处理请求消息时,报头数据会丢失,无法发送到响应主题!我该怎么解决,还是用另一种方法??

  • 红色矩形中样本结果的度量值等于0。没有可供查看的响应数据(标题和正文)。 是否可以在采样结果选项卡中获得实数而不是0 0 0 0 0 0 0,并在响应数据选项卡中获得可见的响应?

  • 问题内容: 我想存储值并从Java HashMap中检索它们。 这是我到目前为止所拥有的: 我想从HashMap中检索所有键和值作为Java集合或实用程序集(例如)。 我知道只要知道密钥就可以获取值,例如: 有没有办法检索键值作为列表? 问题答案: Java Hashmap键值示例:

  • 我想存储值并从Java HashMap中检索它们。 这是我目前所拥有的: 我想从HashMap中检索所有键和值,作为Java集合或实用程序集(例如,LinkedList)。 我知道如果我知道键,我可以得到值,如下所示: 有没有办法以列表的形式检索键值?

  • 我正在编写一个使用React作为前端的程序,以及一个用于后端的Express/Node API,然后在MongoDB数据库中执行CRUD操作。现在,我正在使用本地JS抓取()API在我的前端执行GET/POST操作。GET请求工作正常,但是我的POST请求似乎不工作。在我的前端,我有一个表单和一个表单提交处理程序,如下所示: 然后在端口5002上的Express API上,我有: 然而,当表单提交