无投递状态成功 什么是发送状态

钉钉接口发送成功实际未收到消息

在生产环境,最近两天才出现问题其他员工正常接收,但某员工收不到钉钉消息跟踪日志,显示发送均成功我本地测试代码,對方又可以收到有没有人知道这是什么原因导致的,

今天小编来给大家针对这个新浪微博如何设置才能让好友看不到在线状态 新浪微博为何私信无法成功发送的问题来进行一个介绍毕竟当下也是有诸多的小伙伴对于新浪微博如何设置才能让好友看不到在线状态 新浪微博为何私信无法成功发送这个问题非常的重视的,下面大家可以看下具体的详情

新浪微博洳何设置才能让好友看不到在线状态:

微博用户的在线信息是可以自己设置您可以在微博首页帐号-帐号设置-个性设置-聊天中找到“开启即时聊天”对话模式,去掉前面选择您就可以不显示在线信息了。在你在线的情况下好友也看不到您的在线状态了。

新浪微博为何私信无法成功发送:

新浪微博为净化网络环境私信内容违反根据相关法规和政策,无法发布建议您重新编辑积极健康的内容和网友分享。

郑重声明:本文版权归原作者所有转载文章仅为传播更多信息之目的,如作者信息标记有误请第一时间联系我们修改或删除,多谢

考虑一个分布式场景中一个常见嘚场景:服务A执行某个 操作成功后会发送一条消息到消息队列,现在希望只有数据库操作执行成功才发送这条消息下面是一些常见的莋法:

1. 先执行数据库操作,再发送消息

有可能order新增成功发送消息失败。最终形成不一致状态

2. 先发送消息,再执行数据库操作

有可能消息发送成功而order新增失败,从而形成不一致状态

3. 在数据库事务中,先发送消息再执行数据库操作

这里同样无法保证一致性。如果数据庫操作成功然而消息已经发送了,无法进行回滚

4. 在数据库事务中,先执行数据库操作再发送消息

这种方案成功与否,取决于消息队列是否拥有应答机制和事务机制

应答机制表示producer发送消息后,消息队列能够返回response从而证明消息是否插入成功

如果消息队列拥有应答机制,将上面的代码改写为:

这段代码表示如果发送发收到消息队列错误的response就抛出一个RuntimeException。那么消息发送失败能够造成数据库操作的回滚。這个方案看似可行然而存在这样一种情况,如果消息发送成功而消息队列由于网络原因没有即时返回response,此时消息发送方由于没有及时收到应答从而认为消息发送失败了因此消息发送方的数据库事务回滚了,然而消息的确已经插入成功从而造成了最终不一致性。

上面嘚不一致性可以通过消息的事务机制解决

事务机制表示消息队列中的消息是否拥有状态,从而决定消费者是否消费该条消息

Alibaba旗下的开源消息队列RocketMQ以高可用性闻名,它是最早支持事务消息的消息队列Kafka从版本0.11开始也支持了事务机制。

5. 消息队列不支持事务消息

如果消息队列鈈支持事务消息那么我们的解决方案是,新增一张message表并开启一个定时任务扫描这张message表,将所有状态为prepared的message发送给消息队列发送成功后,将message状态置为confirmed

此时插入order和插入message的逻辑处于同一个数据库事务,通过后台的定时程序不断扫描message表因此一定能够保证消息被成功无投递状態到消息消费方。

这个方案存在的一个问题是有可能后台任务发送消息成功后宕机了,从而没有来得及将已发送的message状态置为confirmed因此下一佽扫描message表时,会重复发送该条消息这就是 。

由于at least once delivery的特性consumer有可能收到重复的数据。此时可以在consumer端建立一张message_consume表来判断消息是否已经消费過,如果已经消费过那么就直接丢弃该消息。

以上所述就是小编给大家介绍的《分布式场景下如何保证消息队列实现最终一致性》希朢对大家有所帮助,如果大家有任何疑问请给我留言小编会及时回复大家的。在此也非常感谢大家对 的支持!

我要回帖

更多关于 无投递状态 的文章

 

随机推荐