解决消息总线里监听线程过多的问题
2016-09-21 10:19
316 查看
在设计基于队列消息总线时,最好避免订阅者直接监听队列,而是再实现一套发布订阅模式,订阅者订阅的不是消息队列的信息,而是系统实现的总线。每次订阅时,判断此订阅消息(队列)是否存在,不存在则往【监听容器】里放,并且初始化一个默认的监听者监听此队列,这个监听者如收到消息,则对订阅者发送消息,这样可以避免直接监听队列造成的线程过多
思路示例:
不过这样也有一个问题,因为每一个订阅者并不是直接监听队列,如果发生问题没有保障,容错性降低了,所以需要在总线里实现一套容错机制(失败重试之类)
最后还是推荐订阅者直接监听队列
思路示例:
public class Bus<TMessage> where TMessage : class { Dictionary<Type , List<object>> _handlers = new Dictionary<Type , List<object>>(); public void Publish( TMessage msg ) { string queueName = msg.GetType().FullName; XXXMQ mq = new XXXMQ( queueName ); mq.Text = Newtonsoft.Json.JsonConvert.SerializeObject( mq ); mq.Send(); } public void Subscribe( TMessage msg , IHandler handler) { Type msgType = msg.GetType(); if( _handlers.ContainsKey( msgType ) ) { List<object> handlers = _handlers[ msgType ]; handlers.Add( handler ); } else { List<object> handlers = new List<object>(); handlers.Add( handler ); _handlers.Add( msgType , handlers ); ListenMQ( msg ); } } private void ListenMQ( TMessage msg ) { Task.Factory.StartNew( () => { while( true ) { string queueName = msg.GetType().FullName; XXXMQ mq = new XXXMQ( queueName ); string text = mq.Receive(); //监听队列 TMessage message = Newtonsoft.Json.JsonConvert.DeserializeObject<TMessage>( text ); List<object> handlers = _handlers[ message.GetType() ]; foreach( var handler in handlers ) { handler( message ); } } } ); } }
不过这样也有一个问题,因为每一个订阅者并不是直接监听队列,如果发生问题没有保障,容错性降低了,所以需要在总线里实现一套容错机制(失败重试之类)
最后还是推荐订阅者直接监听队列
相关文章推荐
- 使用Handler在线程之间传递消息所遇到的问题及解决方法
- 怎么解决mysql sleep线程过多的问题
- Node监听鼠标键盘事件,定时发消息小程序,解决robotjs不支持输入汉字问题!
- 解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题
- 工作线程调用sendmessage()向主对话框发送自定义消息遇到的问题以及解决
- 关于WM_NOTIFY与消息反射————耗费我两天时间才解决的问题
- Windows服务器中终端服务连接数过多问题的解决方法
- 用java收发二进制消息的问题已经解决
- 用窗口消息解决COM接口的多线程访问问题
- 解决msmq接收远程主机私有队列消息的问题!
- 485总线的实际问题和解决办法
- 解决SQL Server占用内存过多的问题
- VS2005中,C#中跨线程访问控件问题解决方案
- 如果我是国王:关于解决 Java 编程语言线程问题的建议
- 解决服务器w3wp.exe进程占用cpu和内存过多问题
- 如何解决SQLServer占内存过多的问题
- 基于消息分发的多线程程序设计,常见的问题,以及解决方法
- 线程正在被中止问题的原因及解决
- 【转贴】如何解决SQLServer占内存过多的问题