MassTransit中Inbox Worker机制及相关问题咨询
MassTransit中Inbox表Worker工作机制疑问
我对MassTransit里Inbox表Worker的工作机制不太理解。目前我的场景是:一个仅负责将数据保存到数据库的简单消费者,消息由Inbox表Worker接收,而非直接来自消息代理,消费者代码如下:
public async Task Consume(ConsumeContext<SendEmailWithOrderDetails> context) { _logger.LogInformation("Sending email to {Email} with order details", context.Message.Email); _dbContext.Emails.Add(new OrderSentEmail() { EmailAdress = context.Message.Email, Subject = "Order details", Body = context.Message.OrderDetails }); await _dbContext.SaveChangesAsync(); _logger.LogInformation("Email sent to {Email}", context.Message.Email); }
由于使用共享DbContext,为避免数据不一致,我认为**保存业务数据、标记消息完成(这里想请教consumed和delivered状态有什么区别?)、以及潜在的消息发布(将实体存入Outbox表)**这几个操作应该处于同一个事务中。
实际测试时,我发现Consume方法执行过程中确实存在事务!但在SaveChangesAsync()行打断点执行后,Emails表已经保存了数据,可InboxState表中的消息既没标记为consumed也没标记为delivered。这会不会导致数据不一致?比如,如果保存业务数据后数据库宕机,没办法标记消息完成,那我是不是得自己实现一个“已处理消息”表来保证幂等性?这岂不是说明Inbox表的作用很有限,只能缓解问题却没法彻底解决?
另外还有个问题:我用这个Worker消费消息(可以保证仅向消费者队列发布一次)时,InboxState表的ReceiveCount居然升到了3。我是本地测试,消息不可能从代理向消费者投递3次,这是怎么回事?
内容的提问来源于stack exchange,提问作者Nathan Ikazuyir
相关产品推荐
相关产品推荐

