daxnet / apworks-core

Apworks framework supporting .NET Core
Apache License 2.0
204 stars 60 forks source link

MessageBus.Subscribe()方法里这段逻辑是不是有问题? #8

Closed yww325 closed 6 years ago

yww325 commented 6 years ago

if (!autoAck) { channel.BasicAck(eventArgument.DeliveryTag, false); }

                  this.OnMessageAcknowledged(new MessageAcknowledgedEventArgs(message, this.messageSerializer, this.autoAck));

应该是if (autoAck)才会去Ack并且调用OnMessageAcknowledged吧。

daxnet commented 6 years ago

autoAck不是指代rmq是否已经ack的一个标记位,而是表示是否需要rmq执行autoAck。如果不需要自动执行ack(也就是autoAck为false),此时需要显式调用BasicAck,以便rmq可以做ack。而不管是否是需要进行autoAck,都设定消息已经被ack过了,所以在任何情况都会触发MessageAcknowledged事件。 autoAck默认为false,也就是必须显式调用了BasicAck,才会确认消息已经派发,否则RabbitMQ会保存未派发的消息,等到下次消息消费者在线的时候,还能继续处理未派发的消息。这对于云架构下的微服务实现是有帮助的,因为云服务下,服务器很有可能在无人值机的情况下宕机。

yww325 commented 6 years ago

哦。那个if (!autoAck)应该是if (!this.autoAck).我还以为是Subscribe方法的一个参数,和是否需要rmq执行autoAck的初始化设置是两个东西。看错了。看来style cop的rulehttp://stylecop.soyuz5.com/SA1101.html 还是有点道理的。