【发布时间】:2017-06-27 16:11:01
【问题描述】:
我正在尝试实现一个事件驱动架构来处理分布式事务。每个服务都有自己的数据库,并使用 Kafka 发送消息以通知其他微服务有关操作。
一个例子:
Order service -------> | Kafka |------->Payment Service
| |
Orders MariaDB DB Payment MariaDB Database
订单收到订单请求。它必须将新订单存储在其数据库中并发布一条消息,以便支付服务意识到它必须为商品收费:
私人订单业务订单业务;
@PostMapping
public Order createOrder(@RequestBody Order order){
logger.debug("createOrder()");
//a.- Save the order in the DB
orderBusiness.createOrder(order);
//b. Publish in the topic so that Payment Service charges for the item.
try{
orderSource.output().send(MessageBuilder.withPayload(order).build());
}catch(Exception e){
logger.error("{}", e);
}
return order;
}
这些是我的疑惑:
- 步骤 a.-(保存在 Order DB 中)和 b.-(发布消息)应在事务中以原子方式执行。我怎样才能做到这一点?
- 这和上一个有关:我发送消息是:orderSource.output().send(MessageBuilder.withPayload(order).build());此操作是异步的,并且始终返回 true,无论 Kafka 代理是否关闭。我如何知道消息已到达 Kafka 代理?
【问题讨论】:
标签: apache-kafka spring-cloud microservices spring-cloud-stream spring-kafka