系统可扩展设计方法之消息队列

消息队列在现在各种系统中都有广泛的应用,除非你做的就是一个单独的工具或小软件, 否则稍大点的系统都会用到消息队列,它对系统的可扩展性很重要。它基于这样的事实,如果系统的各个模块之间的协作不是通过直接的调用关系来实现的,那么系统的可扩展性就一定会更好。

系统各个模块之间只是通过消息队列来传输事件消息,而各模块之间并没有直接的调用关系、保持松散的耦合关系。

事件驱动架构最典型的一个应用就是操作系统中常见的生产者和消费者模式,将其应用到网站设计中就是分布式消息队列。

分布式消息队列同样采用了生产者和消费者模式:

  • 消息的发送者负责将消息发布到消息队列中,也就是「生产者」;
  • 另外,系统中会有一个或者多个消息接收者订阅消息,订阅目的是为了获取消息并进行处理,这里的消息订阅者其实就是「消费者」。消息接收者发现消息队列中有新的消息后,就会立马对其进行处理。

可以看到,在这种模式下,消息的发送者和接收者之间并没有任何直接的联系,是松耦合的。它们的协作是通过消息队列这个「中间人」进行的。消息的发送者将消息发送至消息队列后,就结束了对消息的处理,而消息的接收者只是从消息队列中获取消息进行后续的处理,并不需要知道这些消息从哪里来,因此可以很方便的实现高可扩展性。

所以,采用这种模式的话,当网站需要增加新功能的时候,只要增加对应的新模块,再由对此模块感兴趣的「消费者」进行订阅,就可以实现对原有系统功能的扩展了,而对原本的系统模块本身并没有影响。

引入了消息队列后,不仅可以提高系统的可扩展性,还可以再一定程度上改善网站架构的高性能、高可用性和可伸缩性。

  • 从性能方面来看,消息发送者不需要等接收者实际处理完成后才返回,也就是从原本的同步处理变成了异步处理,所以用户会感知到网站性能的提升。
  • 从高可用方面来看,假如消息的接收者模块发生了短时间的故障,此时并不会影响消息发送者向消息队列中发送消息,等到消息接收者模块恢复后可以继续后续的处理,只要这段时间内消息队列本身没有被塞满而出现消息丢失的情况。从整体角度看,系统并不会感知到消息接收者模块曾经发生过短暂故障,也就相当于保证了系统的高可用。
  • 从可伸缩性方面来看,消息队列的核心其实就是一个无状态的存储。所以,当系统需要能够保留更多的消息时,通过简单的增加存储空间就可以实现。尤其是,大规模的电商网站来更会将消息队列扩展成为分布式消息队列集群,来实现消息队列的可伸缩性。

引入消息队列后,测试人员需要额外关注的点。

  • 从构建测试数据的角度来看,为了以解耦的方式测试系统的各个模块,需要在消息队列中构造测试数据。这也是为什么很多互联网的自动化测试框架中都会集成有消息队列写入工具的主要原因。
  • 从测试验证的角度来看,不仅需要验证模块的行为,还要验证模块在消息队列中的输出是否符合预期。为此,互联网的自动化测试框架中也都会集成消息队列的读取工具。
  • 从测试设计的角度来看,需要考虑消息队列满、消息队列扩容等情况下系统功能是否符合设计预期。
  • 除此之外,还需要考虑,某台消息队列服务器宕机的情况下,丢失消息的可恢复性以及新的消息不会继续发往宕机的服务器等等。

原文地址:https://www.cnblogs.com/doit8791/p/10772278.html

时间: 2024-10-13 19:14:30

系统可扩展设计方法之消息队列的相关文章

nmq消息队列解析

消息中间件NMQ 1.What is nmq? nmq = new message queue; 一个通用消息队列系统 为在线服务设计 什么是消息队列?问什么需要?有哪些功能? 消息队列的本质:1.多个不同的应用之间实现相互通信的一种异步传输模式2.异步3.解耦 业界有哪些比较好的mq? yahoo YMB .twitter Kestrel.amazon SQS.apache kafka 百度的nmq和bigpipe 那么为什么会有这么多的实现呢? 影响设计的关键需求: 1.数据安全性 2.传输

消息队列设计精要【转】

消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一. 当今市面上有很多主流的消息中间件,如老牌的ActiveMQ.RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发的Notify.MetaQ.RocketMQ等. 本文不会一一介绍这些消息队列的所有特性,而是探讨一下自主开发设计一个消息队列时,你需要思考和设计的重要方面.过程中我们会参考这些成熟消息队列的很多重要思想. 本文首先会阐述什么时候你需要

消息队列设计精要(转)

消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流的消息中间件,如老牌的ActiveMQ.RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发的Notify.MetaQ.RocketMQ等.本文不会一一介绍这些消息队列的所有特性,而是探讨一下自主开发设计一个消息队列时,你需要思考和设计的重要方面.过程中我们会参考这些成熟消息队列的很多重要思想.本文首先会阐述什么时候你需要一个消

Python 番外 消息队列设计精要

消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流的消息中间件,如老牌的ActiveMQ.RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发的Notify.MetaQ.RocketMQ等.本文不会一一介绍这些消息队列的所有特性,而是探讨一下自主开发设计一个消息队列时,你需要思考和设计的重要方面.过程中我们会参考这些成熟消息队列的很多重要思想.本文首先会阐述什么时候你需要一个消

消息队列设计精要(转载)

消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流的消息中间件,如老牌的ActiveMQ.RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发的Notify.MetaQ.RocketMQ等.本文不会一一介绍这些消息队列的所有特性,而是探讨一下自主开发设计一个消息队列时,你需要思考和设计的重要方面.过程中我们会参考这些成熟消息队列的很多重要思想.本文首先会阐述什么时候你需要一个消

【转】消息队列设计精要

介绍的比较全面,可以借鉴学习:原文连接:http://tech.meituan.com/mq-design.html 消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流的消息中间件,如老牌的ActiveMQ.RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发的Notify.MetaQ.RocketMQ等.本文不会一一介绍这些消息队列的所有特性,而是探讨一下自主开发设计一个消息

消息队列mq的原理及实现方法

消息队列技术是分布式应用间交换信息的一种技术.消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走.通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置.或在继续执行前不需要等待接收程序接收此消息.   消息中间件概述 消息队列技术是分布式应用间交换信息的一种技术.消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走.通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置.或在继续执行前不需要等待接收程序接收此消息. 在分布式计算环境中,为了集成分布式应

thinkphp5 消息队列thinkphp-queue扩展

1.简介 thinkphp-queue是thinkphp的一个第三方扩展, 内置了 Redis,Database,Topthink ,Sync这四种驱动,推荐使用redis 2. 下载 和安装 composer require topthink/think-queue 配置目录在: application/extra/queue.php return [ 'connector' => 'Redis', // Redis 驱动 'expire' => 60, // 任务的过期时间,默认为60秒;

【系统架构】分布式消息队列

原文地址 以下是消息队列以下的大纲,本文主要介绍消息队列概述,消息队列应用场景和消息中间件示例(电商,日志系统). 本次分享大纲 消息队列概述 消息队列应用场景 消息中间件示例 JMS消息服务(见第二篇:大型网站架构系列:分布式消息队列(二)) 常用消息队列(见第二篇:大型网站架构系列:分布式消息队列(二)) 参考(推荐)资料(见第二篇:大型网站架构系列:分布式消息队列(二)) 本次分享总结(见第二篇:大型网站架构系列:分布式消息队列(二)) 一.消息队列概述 消息队列中间件是分布式系统中重要的