【发布时间】:2021-04-21 10:38:23
【问题描述】:
我有 REST API 网关,它使用 MassTransit 请求客户端调用其中一项微服务。这个请求不是持久的,并且只存在很短的时间 - 本质上它只是替换“传统”同步(通过 HTTP/GRPC/等)网关-微服务通信。
在微服务方面,我有消费者,它在后台使用 DbContext 和事务 (EFC) 在数据库中执行一些工作。工作完成后,它应该发布“WorkDoneEvent”(稍后由其他微服务使用)并将工作结果返回给 api 网关。事件必须与用于执行工作的事务一起以原子方式发布。 ApiGateway 是否会收到响应/是否会重试请求并不重要 - 一旦提交事务,必须保证工作结果和发送“WorkDoneEvent”。
通常这是通过事务发件箱完成的,它首先将发布的事件保存到与工作完成相同的事务中的数据库中。 (然后一些进程不断地“轮询”发件箱并尝试向代理发送消息,完成后它会从发件箱中删除消息)。据我所知。
MassTransit 似乎内置了交易发件箱:https://masstransit-project.com/advanced/middleware/transactions.html#transactional-bus。
但在文档中明确指出:
在编写消费者时切勿使用 TransactionalBus 或 TransactionalEnlistmentBus。这些工具非常具体,只应在所描述的场景中使用。
而这正是我想做的……
为什么我不应该这样做?
【问题讨论】:
标签: masstransit