响应

dvtswwa3  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(330)

tldr:具有请求/响应模式。当前请求通过activemq队列完成,响应通过memcached键值存储(由前端轮询)完成。出于各种原因,我们想迁移到Kafka,想知道我们是否可以重新设计响应路径,不使用memcached。
我试图了解什么将是最佳实践系统设计以下问题。
我们有一个前端,它生成需要大量处理的请求。应用程序需要响应才能前进。有时我们需要撤消/后退(这会使您恢复到以前的状态)。有一组后端可以执行繁重的处理步骤。
在我们当前的设置中,前端将请求推入队列(当前为activemq),后端尽可能地处理队列中的项目,并将结果存储在键值存储(memcached)中,键值是队列中消息的uuid(它本身是唯一的会话id+非唯一的步骤id)。前端正在轮询存储以获取消息的uuid。这样做的好处是前端可能会失去连接/etc,但只要会话id被保留,我们就可以ping键值存储以获得所需的结果。我们有时还需要向后移动/撤消操作,并且可以在键值存储中返回结果(因为每个步骤都有自己的uuid,并且所有uuid都是已知的)。
但是,将来我们希望能够至少部分地通过队列进行响应,这样我们就可以拥有一些分析工具作为请求和响应的消费者。“最小的改变”是将响应生产者推入一个队列,并将memcached作为消费者之一。但也许有更好的办法。我们也在考虑从activemq切换到kafka,因为这将给我们提供可重放性(但我们没有kafka的经验)。
在kafka看来,要得到一条特定的消息,您需要扫描整个分区,有没有更简单的方法来检索特定的消息?我们是否为每个交互序列生成一个主题?如果我们想重播,但不知道补偿什么是我们的资源(除了看了很多消息)?我们的负载非常小(约1百万条消息/天),所以我想除了什么是最佳实践(臭名昭著的,如果我们扩展怎么办)?

wbrvyc0a

wbrvyc0a1#

我理解你的用例,你没有一个有效的方法通过push将响应传递给应用程序,这就是为什么你让应用程序可以通过id(key)获取响应。您可以切换出各种组件,例如,用于kafka的activemq,用于任何其他kv存储的memcached,但最终如果您的限制是应用程序需要从服务器获取结果,那么您将始终必须使用异步传输的响应,并使其在服务器上可用。例如,如果您切换到kafka,您可以在kafka流中将您的消费者实现为一个[全局]ktable,并以这种方式提供响应,但这仍然只是一个带有额外步骤的kv存储。没有好的方法可以直接从Kafka的主题中获得特定的信息/偏移量,这并不是它真正的用途。
在不知道更多细节的情况下,将异步传输组件(activemq、kakfa等)与服务组件分开似乎是明智的,以便能够分别扩展或交换它们。例如,如果扩展到不再适合单个memcached示例的内存大小,则可以直接迁移到任意数量的分布式存储,如redis、couchbase、dynamodb等。

相关问题