单应用下RabbitMQ如何保证线程安全,及多应用下抢数据问题

消费RabbitMQ时的注意事项,如何禁止大量的消息涌到Consumer,保证线程安全:

按照官网提供的订阅型写法( Retrieving Messages By Subscription ("push API") ) 我发现,RabbitMQ服务器会在短时间内发送大量的消息ç>>™Consumerï¼Œç„¶åŽï¼Œå¦‚æžœä½ æ²¡æœ‰æ¥å¾—åŠAck的话,那么服务ç<<¯ä¼šç§¯åŽ‹å¤§é‡çš„UnAcked消息,而Consumer如果来不急处理也会处于假æ­>>(也可能引起程序崩溃)。

ä>>…有两个Channel,ç>>“果积压了大量的UnAcked消息。

这明显是与我ä>>¬çš„目的不一致,我ä>>¬ä¸èƒ½ä¿è¯Consumer一 定会及时å¿<<速的处理消息。所ä>>¥è¿™ç§æ–¹å¼å¸¦æ¥çš„后果就是Consmer崩溃后,UnAcked消息又ReQueue,这肯定会消耗MQ的宝贵资源。

我试图在官网上找到一种方法,让每条消息明确的Ack后再接受下一条。但是没有。好在在 gitbooks.io/rabbitmq-quick/ 这儿找到了,通过设置Channel的QOS即可

var channel = Connect.CreateModel();

channel.BasicQos(0,1,false); //RabbitMQ客户ç<<¯æŽ¥å—消息最大数量

设置后的ç>>“果:

在开启4个Consumer的情况下,每条消息处理要耗时2秒。然后问题解决了。Unacked的消息只有4个。

让每条消息明确的Ack后再接受下一条,通过这种方式不ä>>…可ä>>¥è§£å†³ç§¯åŽ‹å¤§é‡æ¶ˆæ¯çš„é—®é¢˜ï¼Œè¿˜å¯ä>>¥é˜²æ­¢å¤šæ¡æ¶ˆæ¯åŒæ—¶æ¶Œå…¥è€Œå¯¼è‡´çš„多线程不安全问题。

多应用:

当然在单应用下上面的方案已ç>>å¯ä>>¥è§£å†³å¤§éƒ¨åˆ†é—®é¢˜ï¼Œä½†æ˜¯åœ¨å¤šåº”用下似乎不太理想。

刚开始是单应用服务,但是后来用户量并发量提é<<˜äº†ï¼Œæ¸æ¸åœ°å•应用服务扛不住了,就通过Nginxè´Ÿè½½å‡è¡¡åˆ†æ‹…åˆ°å¦å¤–ä¸€å°æœåŠ¡æœºï¼Œæ­¤æ—¶å°±æ˜¯åŒåº”ç”¨äº†ã€‚è¿™æ ·ä¸€æ¥æœ‰ä¸¤ä¸ªåº”ç”¨åŒæ—¶ç›‘å¬åŒä¸€ä¸ªæ¶ˆæ¯é˜Ÿåˆ—ï¼Œæœ‰ä¸¤ä¸ªæ¶ˆè´¹è€…ã€‚

消息队列的处理机制:一个消息队列里面的一条消息只会ä>>…且发送到一个消费者里面,等待该消费者Ack,一条消息就完成它的使命了。

本ä>>¥ä¸ºè¿™æ ·å­å¤šåº”用下也不会出现ä>>€ä¹ˆé—®é¢˜ï¼Œä½†æ˜¯é—®é¢˜å´å‡ºåœ¨åˆ<<的地方了。

(注:应用A与应用B同库)当第一条消息分发到 应用A,第二条消息分发到 应用B,ä>>–ä>>¬å‡ 乎是同时进行,消息A在应用A处理事务,消息B在应用B处理事务,ä>>–ä>>¬éƒ½éœ€è¦èŽ·å–æ•°æ®åº“ä¸­çš„æŸæ¡æ•°æ®å¹¶ä¸”æ›´æ–°å…¶çŠ¶æ€ï¼Œç”±äºŽA没处理完数据状态未改,Bå› æ­¤ä¹ŸèŽ·å¾—äº†ç›¸åŒçš„ä¸€æ¡æ•°æ®ï¼Œå¯¼è‡´A,B抢了同一条数据做处理了。由于应用A,应用B都是独ç<<‹çš„æœåŠ¡ï¼Œæ‰€ä>>¥å•应用下的在ä>>£ç é‡Œé¢åŠ 同步锁这些对ä>>–ä>>¬æ¯<<æ— ä½œç”¨ã€‚

A,B同库,试着利用数据库本èº<<的è¯>>写锁机制,进一步优化

在insert之前在做一次判断,如果更新成功则insert,否则表明该数据已ç>>è¢<<更新了,放弃insert。

åŠ äº†è¿™ç§åˆ¤æ–­æ–¹å¼ç¡®å®žå‡å°‘äº†å¾ˆå¤šæŠ¢æ•°æ®é—®é¢˜ï¼Œä½†å¹¶ä¸èƒ½å®Œå…¨è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œæ¯•ç<<Ÿæ•°æ®åº“锁只是在è¯>>å†™çš„æ—¶å€™å¯¹ä¸€æ¡æ•°æ®çš„åŠ é”ï¼Œæ“ä½œå®Œäº†é‡Šæ”¾ï¼Œä½†ç”±äºŽåŒæ­¥æ€§å¤ªé<<˜ï¼Œå¹¶ä¸èƒ½è§£å†³çŽ°åœ¨çš„é—®é¢˜ã€‚

æœ€åŽè€ƒè™‘åˆ°ä¸¤ä¸ªåº”ç”¨éƒ½æ˜¯å®Œå…¨ä¸€æ ·çš„ï¼Œæ‰€ä>>¥å°±å¹²æŽ‰ä¸€ä¸ªåº”ç”¨çš„æ¶ˆæ¯æ¶ˆè´¹è€…ï¼Œåªä¿ç•™ä¸€ä¸ªæ¶ˆè´¹è€…ï¼Œè¿™æ ·å°±å¯ä>>¥å›žå½’到单应用的情景了。

æ€>>ç>>“:

这也是为ä>>€ä¹ˆåœ¨åˆ†å¸ƒå¼ï¼Œå¾®æœåŠ¡ä¸‹åˆ†å¸ƒå¼äº‹åŠ¡çš„å¿…è¦æ€§å’Œé‡è¦æ€§ï¼Œç›®å‰åˆ†å¸ƒå¼äº‹åŠ¡ä¸>>要通过 MQ+事ä>>¶è¡¨ã€ä¸šåŠ¡è¡¥å¿ã€TCC、对账等方式实现,但都不好做,所ä>>¥å°½é‡é¿å…ã€‚在使用分布式,微服务带来的方便同时,也得为事务的四个特性(原子性,一致性,隔ç¦>>性,持久性)ä>>˜å‡ºä>>£ä>>·ã€‚

关注公众号,分äº<<干货,讨论技术


作者:molashaonian

相关推荐
molashaonian6 小时前
MongoDB 之 aggregate $lookup 关联查询 进阶篇
热点·深度解读·今日热点
Litluecat2 个月前
2026年6月11日科技热点新闻
科技·量子计算·热点·新闻·每日·速览
Litluecat2 个月前
2026年6月9日科技热点新闻
科技·热点·新闻·每日·速览
Litluecat2 个月前
2026年6月6日科技热点新闻
人工智能·科技·热点·每日
Litluecat2 个月前
2026年6月4日科技热点新闻
科技·推荐·热点·新闻·每日
Litluecat2 个月前
2026年6月5日科技热点新闻
科技·推荐·热点·新闻·每日
Litluecat2 个月前
2026年6月2日科技热点新闻
科技·热点·新闻·每日
Litluecat2 个月前
2026年6月1日科技热点新闻
大数据·人工智能·科技·推荐·热点·新闻·每日
Litluecat2 个月前
2026年5月31日科技热点新闻
人工智能·科技·热点·新闻·每日·速览