【发布时间】:2018-07-18 16:19:05
【问题描述】:
我正在开发一个接受用户请求的 REST 服务。每个用户请求都代表着繁重的计算工作。我不希望计算工作阻止 REST 服务。我的设计是将用户请求包装为一个任务(具有唯一的任务 ID)并推送到 Kafka。后台工作人员订阅 Kafka 并处理任何传入的任务。 REST 服务将任务保存到数据库中,将任务 ID 推送到 Kafka,然后立即返回任务 ID。用户使用任务 id 不断轮询任务状态。
这个设计不错。但是我仍然不知道如何处理一种情况:如果在将任务保存到数据库后,但在将任务id推送到Kafka之前,服务立即崩溃(例如进程关闭,容器退役),那么任务将永远不会被处理。
这是一种可能很少发生的极端情况。但在服务重启或重新部署期间,可能会发生这种情况。那么我怎样才能使这两个操作(保存到数据库和推送到 Kafka)成为原子操作?或者有什么解决方法吗?
【问题讨论】:
-
既然你使用的是 Kafka,那么用Kafka Streams API 来实现这个怎么样?你甚至不需要单独的数据库,因为 Kafka Streams 支持有状态的流处理。状态在内部保持不变,并通过写入 Kafka 的状态更改日志支持故障转移。
标签: rest asynchronous apache-kafka message-queue