认识消息队列(一) 转

一、消息队列的特性

业务无关,一个具有普适性质的消息队列组件不需要考虑上层的业务模型,只做好消息的分发就可以了,上层业务的不同模块反而需要依赖消息队列所定义的规范进行通信。

FIFO,先投递先到达的保证是一个消息队列和一个buffer的本质区别。

FIFO: First Input First Output的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。

容灾,对于普适的消息队列组件来说,节点的动态增删和消息的持久化,都是支持其容灾能力的重要基本特性。当然,这个特性对于游戏服务器中大部分应用中的消息队列来说不是必须的,这个也是跟应用情景有关的,很多时候没有这种持久化的需求。

性能,这个不必多说了,消息队列的吞吐量上去了,整个系统的内部通信效率也会有提高。

二、为什么需要消息队列?

主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达MySQL,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。

个人觉得消息队列主要的意义是解耦和异步处理,以及在高并发场景下平滑短时间内大量的服务请求

消息队列不仅被用于系统内部组件之间的通信,同时也被用于系统跟其它服务之间的交互

消息队列的使用可以增加系统的可扩展性、灵活性和用户体验

非基于消息队列的系统,其运行速度取决于系统中最慢的组件的速度(注:短板效应)。

而基于消息队列可以将系统中各组件解除耦合,这样系统就不再受最慢组件的束缚,各组件可以异步运行从而得以更快的速度完成各自的工作。

消息队列能够将业务逻辑解耦,调用方只需要下达命令而不用等待整个逻辑执行完毕。除此之外消息队列也可以抑制性能波峰的产生,在瞬时业务增长产生时保持性能曲线的平滑。

当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异。“ 消息 ”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。消息被发送到队列中,“ 消息队列 ”是在消息的传输过程中保存消息的容器 。

举几个例子

1)业务系统触发短信发送申请,但短信发送模块速度跟不上,需要将来不及处理的消息暂存一下,缓冲压力。就可以把短信发送申请丢到消息队列,直接返回用户成功,短信发送模块再可以慢慢去消息队列中取消息进行处理。

2)调远程系统下订单成本较高,且因为网络等因素,不稳定,攒一批一起发送。

3)任务处理类的系统,先把用户发起的任务请求接收过来存到消息队列中,然后后端开启多个应用程序从队列中取任务进行处理。

三、使用消息队列有什么好处?

3.1、提高系统响应速度

使用了消息队列,生产者一方,把消息往队列里一扔,就可以立马返回,响应用户了。无需等待处理结果。

处理结果可以让用户稍后自己来取,如医院取化验单。也可以让生产者订阅(如:留下手机号码或让生产者实现listener接口、加入监听队列),有结果了通知。获得约定将结果放在某处,无需通知。

3.2、提高系统稳定性

考虑电商系统下订单,发送数据给生产系统的情况。电商系统和生产系统之间的网络有可能掉线,生产系统可能会因维护等原因暂停服务。如果不使用消息队列,电商系统数据发布出去,顾客无法下单,影响业务开展。两个系统间不应该如此紧密耦合。应该通过消息队列解耦。同时让系统更健壮、稳定。

异步化解耦消除峰值

以上三点其实可以用一个例子来解释——设想有一款MMO游戏,没有人肉写的缓存层或者ORM,所有逻辑节点都直连MySQL,逻辑节点内除了要关注场景、战斗、交互等复杂逻辑以外,还要有个拼SQL语句的模块,想想简直是蛋疼。先考虑一下这样设计的弊端所在:

1. 逻辑节点与Db的交互会有大量IO,即使把与Db交互的模块耦合在逻辑节点内,其实现对你来说是黑盒,如果内部是同步实现的,那就直接卡你游戏主逻辑,就因为一次存盘操作,玩家们都掉线了,服务器也可以关掉了。

2. 那么我们改进一下,针对1的情况,可以把这个模块做到一个线程里挂在逻辑节点上。这样其实逻辑节点跟这个Db前端模块的交互就会基于一个比较原始的消息队列。但是这样还有一个坏处,那就是这两种任务一种是计算密集的(玩家的逻辑处理)、一种是IO密集的(只负责写入读取MySQL),搞到一个节点中,扩展起来会非常麻烦,而且耦合度太高。比如说现在发现场景放单节点上有瓶颈,要按场景分节点,那么这种挂在上面的数据模块怎么跟其他场景的交互呢?

3. 峰值的问题。在分布式系统中,一次分布式事务关联的是多个节点,其中每一个节点出现问题都会成为整个事务处理流程中的瓶颈。如果逻辑节点与数据库之间没有一个起到缓冲作用的节点,那就是每次操作都要访问数据库,对于MMO来说,一个玩家上线load几百K数据,一个服10万个玩家上线已经足够搞垮一个mysql节点了。如果直接搞垮还是比较好的结果,至少是前面的玩家确实登录上去了并且可以正常游戏,后面的玩家登录不上。但是很可惜,十年前开始流行的C10K说法就是在讲:并发量上来之后,会造成chain reaction,大量的并发不会直接挂掉你的mysql节点,但是会拖慢速度,降低吞吐量,一个玩家的请求由于处理时间太长,导致玩家放弃重试,但是对于后端来说,对该玩家之前的处理过程消耗的资源就全部浪费了,陷入恶性循环。

所以,这种情景下,一个介于逻辑节点和db节点之间的缓存节点就是理所当然的事情了。这个缓存节点其实很多时候也可以看作是一个更复杂的消息队列节点。

四、为什么需要分布式?

4.1、多系统协作需要分布式

消息队列中的数据需要在多个系统间共享数据才能发挥价值。所以必须提供分布式通信机制、协同机制。

4.2、单系统内部署环境需要分布式

单系统内部,为了更好的性能、为了避免单点故障,多为集群环境。集群环境中,应用运行在多台服务器的多个JVM中;数据也保存在各种类型的数据库或非数据库的多个节点上。为了满足多节点协作需要,需要提供分布式的解决方案。

五、分布式环境下需要解决哪些问题?

5.1、并发问题

需进行良好的并发控制。确保“线程安全“。不要出现一个订单被出货两次。不要出现顾客A下的单,发货发给了顾客B等情况。

5.2、简单的、统一的操作机制

需定义简单的,语义明确的,业务无关的,恰当稳妥的统一的访问方式。

5.3、容错

控制好单点故障,确保数据安全。

5.4、可横向扩展

可便捷扩容。

六、如何实现?

成熟的消息队列中间件产品太多了,族繁不及备载。成熟产品经过验证,接口规范,可扩展性强。

结合事业环境因素、组织过程遗产、实施运维考虑、技术路线考虑、开发人员情况等原因综合考虑。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JAVA技术zhai

优化不易,且写且珍惜!

本文要感谢我职级评定过程中的一位评委,他建议把之前所做的各种性能优化的案例和方案加以提炼、总结,以文档的形式沉淀下来,并在内部进行分享。力求达到如下效果:

46370
来自专栏Python中文社区

五个亲测可用的Python论坛类网站开源框架

1、LBForum LBForum是用django开发的论坛系统,LBForum主要注重部署的方便性和易用性,功能方面目前还比较简单。 LBForum的开发尽量...

1.7K100
来自专栏北京马哥教育

Linux 下的两种分层存储方案

在存储设备中,使用分层技术,将冷热数据自动分层存放在具有不用读写性能的存储介质上,已经是很普遍的做法,比如 IBM 的 DS8K 中使用的 Easy Tier。...

40560
来自专栏Java架构师历程

WebBuilder —— Web 开发平台

WebBuilder是一款跨平台、数据库和浏览器的可视化Web应用开发平台,使用了多项最新的技术,使Web应用的开发更快捷和简单。

1.5K40
来自专栏Ceph对象存储方案

对象存储服务-构架设计

对象存储服务构架设计 基本构架组成 ? 1.网关服务(Gateway): 客户端发送请求(Request)到网关服务(Gateway)再由网关服务实现将客户端请...

64840
来自专栏安恒信息

下一代堡垒机如何管理成千上万台服务器

对管理和运维成千上万台服务器来说,用户都是既想安全又想便捷。但是安全与便捷通常都是矛盾的,因为安全性越高,意味着便捷度越低。 ? 要实现“统一认证、统一管理、...

58290
来自专栏腾讯DevOps

Git Code Review设置与使用

自从转到git上之后,已经一年多没有code review了(哈哈,捂住无辜的小脸)。但是坦白来说,code review绝对是利大于弊的。不仅可以让自己把控代...

1.2K40
来自专栏java一日一条

影响Java EE性能的十大问题

本文作者是一名有10多年经验的高级系统架构师,他的主要专业领域是Java EE、中间件和JVM技术。他在性能优化和提升方面也有很深刻的见解,下面他将和大家分享一...

11020
来自专栏互扯程序

如何构建一个较为通用的业务技术架构

现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

12230
来自专栏哲学驱动设计

OEA框架 2.9 Pre-Alpha 源码公布

    OEA框架 从 2009 年发布“第一个版本”之后,历时三年,现在终于又公开向大家开放最新的源代码。三年来,许多朋友都关心 OEA 是否还在开发,是否还...

21370

扫码关注云+社区

领取腾讯云代金券