网易视频云分享:消息队列设计中如何保证同一用户的消息按序处理
2016-06-03 15:26
561 查看
消息队列是应用开发的常用工具,也是系统解耦的必备利器。保证同一用户的消息按照顺序处理是应用的常见需求, 譬如在微博应用中,发表微博、删除微博这两个操作必须按序处理,乱序势必造成业务逻辑错误。
如何保证消息处理顺序?以下是常见的几种做法。
设计一:单线程处理。 虽然单线程处理非常简单好用,但是单线程限制了系统吞吐率。
设计二: 每个用户一个队列。看起来很美,实际上基本不可行。首先,每个消息队列基本都没啥消息,其次,不可能为每个用户安排一个线程。
设计三: 静态消息分发。系统设计分发线程和工作线程,每工作线程设置一个线程私有的消息队列,工作线程从私有消息队列取消息,执行业务逻辑。假定工作线程个数为N, 分发线程从全局的消息队列取消息,推消息到第
Hash(用户名)%N个线程私有队列。 静态消息分发一般来说够用,但也存在一些弱点。首先存在伪冲突,隶属于同一个私有队列的消息按序处理,慢消息将阻塞私有队列中的后续消息,所以无法适用于实时性要求较高的应用。其次,全局阻塞问题。线程私有队列慢时,分发线程停顿,造成全局停顿,几乎无法接受。
设计四:动态路由消息队列。设计一种新的消息队列,支持以下功能:(1)路由。工作线程取消息时,只能取出不在路由表中的消息,取出消息之后,登记到路由表。(2)ACK。工作线程处理完消息之后,调用ACK接口,消息队列删除消息,并清理路由表。从动态路由消息队列取消息,即不存在为冲突,也不存在全局阻塞,恰好能解决问题。
如何保证消息处理顺序?以下是常见的几种做法。
设计一:单线程处理。 虽然单线程处理非常简单好用,但是单线程限制了系统吞吐率。
设计二: 每个用户一个队列。看起来很美,实际上基本不可行。首先,每个消息队列基本都没啥消息,其次,不可能为每个用户安排一个线程。
设计三: 静态消息分发。系统设计分发线程和工作线程,每工作线程设置一个线程私有的消息队列,工作线程从私有消息队列取消息,执行业务逻辑。假定工作线程个数为N, 分发线程从全局的消息队列取消息,推消息到第
Hash(用户名)%N个线程私有队列。 静态消息分发一般来说够用,但也存在一些弱点。首先存在伪冲突,隶属于同一个私有队列的消息按序处理,慢消息将阻塞私有队列中的后续消息,所以无法适用于实时性要求较高的应用。其次,全局阻塞问题。线程私有队列慢时,分发线程停顿,造成全局停顿,几乎无法接受。
设计四:动态路由消息队列。设计一种新的消息队列,支持以下功能:(1)路由。工作线程取消息时,只能取出不在路由表中的消息,取出消息之后,登记到路由表。(2)ACK。工作线程处理完消息之后,调用ACK接口,消息队列删除消息,并清理路由表。从动态路由消息队列取消息,即不存在为冲突,也不存在全局阻塞,恰好能解决问题。
相关文章推荐
- 简单易懂云计算(转自天涯感谢原楼主iamsatisfied)
- 2011云计算知识库:盘点千奇百怪的云名称
- openstack kilo-with-dokcer
- 3ff8 《sharepoint 2010云计算解决方案》使用SQL Azure 的BI 解决方案
- IaaS, PaaS, SaaS 解释
- 在Google使用Borg进行大规模集群的管理 3-4
- 在Google使用Borg进行大规模集群的管理 5-6
- 在Google使用Borg进行大规模集群的管理 7-8
- 未来的容器云技术栈会怎么样?在容器技术大会上的演讲
- 仿OpenStack开发云计算管理软件”--第1周:熟悉开发环境
- Hadoop2.4.1伪分布式的搭建
- Hadoop上路_14-Hadoop2.3.0的分布式集群搭建
- 联想创投5亿美元基金,聚焦云计算、大数据等技术领域投资
- [转载]理解云计算:SaaS、PaaS与IaaS
- 参加2013大数据全球技术峰会有感
- CloudStack 的配置、部署与管理,以及 API 的使用
- 得意与失意:云计算时代的IT岗位
- KVM的概念和云计算