如何解决在消费者内部使用事务总线
我有 REST API 网关,它使用 MassTransit 请求客户端调用微服务之一。这个请求不是持久的,而且是短暂的——本质上它只是替代了“传统的”同步(通过 HTTP/GRPC/等)网关-微服务通信。
在微服务方面,我有使用 DbContext 和事务 (EFC) 在数据库中执行一些工作的消费者。工作完成后,它应该发布“WorkDoneEvent”(稍后由其他微服务使用)并将工作结果返回给api网关。事件必须与用于执行工作的事务一起以原子方式发布。 ApiGateway 是否会收到响应/是否会重试请求无关紧要 - 一旦事务提交,必须保证工作结果和发送“WorkDoneEvent”。
通常这是通过事务发件箱完成的,它首先在工作完成时将发布的事件保存到同一事务中的数据库中。 (然后一些进程不断地“轮询”发件箱并尝试向代理发送消息,完成后它会从发件箱中删除消息)。据我所知。
MassTransit 似乎内置了事务发件箱:https://masstransit-project.com/advanced/middleware/transactions.html#transactional-bus。
但是在文档中它明确指出:
在编写消费者时切勿使用 TransactionalBus 或 TransactionalEnlistmentBus。这些工具非常具体,只能在所描述的场景中使用。
这正是我想要做的......
为什么我不应该这样做?
解决方法
我建议使用 InMemoryOutbox,它是 MassTransit 的一部分。它的重量要轻得多,旨在在消费者中工作,并且在消费者完成之后(但在代理处确认消息之前)才会发布您的事件。唯一的考虑是您的使用者应该是幂等的(在您的方法中也需要如此),如果操作已在重试时执行,则应重新发布事件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。