`

消息队列(Message Queue)基本概念,如redis,kafka

阅读更多

##背景

之前做日志收集模块时,用到flume,另外也有的方案,集成kafaka来提升系统可扩展性,其中涉及到消息队列,当时自己并不清楚为什么要使用消息队列,而在我自己提出的原始日志采集方案中不适用消息队列时,有几个基本问题:1.日志文件上传过程,有个基本的生产者-消费者问题;2.另外系统崩溃时,数据丢失的处理问题。

今天,几位同事再次谈到消息队列这么个东西,很NB的样子,我也想弄清楚,OK,搞起。

##什么是消息队列

消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。其主要用途:不同进程Process/线程Thread之间通信。为什么会产生消息队列?这个问题问的好,我大概查了一下,没有查到最初产生消息队列的背景,但我猜测可能几个原因:

  • 不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程,为了隔离这两个进程,在两进程间抽离出一层(一个模块),所有两进程之间传递的消息,都必须通过消息队列来传递,单独修改某一个进程,不会影响另一个;
  • 不同进程(process)之间传递消息时,为了实现标准化,将消息的格式规范化了,并且,某一个进程接受的消息太多,一下子无法处理完,并且也有先后顺序,必须对收到的消息进行排队,因此诞生了事实上的消息队列

不管到底是什么原因催生了消息队列,总之,上面两个猜测是其实际应用的典型场景。

##为什么要用

切合前一部分猜测的消息队列产生背景,其主要解决两个问题:

  • 系统解耦:项目开始时,无法确定最终需求,不同进程间,添加一层,实现解耦,方便今后的扩展。
  • 消息缓存:系统中,不同进程处理消息速度不同,MQ,可以实现不同Process之间的缓冲,即,写入MQ的速度可以尽可能地快,而处理消息的速度可以适当调整(或快、或慢)。

下面针对系统解耦消息缓存两点,来分析实际应用消息队列过程中,可能遇到的问题。虚拟场景:Process_A通过消息队列MQ_1向Process_B传递消息,几个问题:

  • 针对MQ_1中一条消息message_1,如何确保Process_B从MQ_1中只取一次message_1,不会重复多次取出message_1?
  • 如果MQ_1中message_1已经被Process_B取出,正在处理的关键时刻,Process_B崩溃了,哭啊,我的问题是,如果重启Process_B,是否会丢失message_1?

不要着急,阅读了下面的简要介绍后,水到渠成,上面几个问题就可以解决了。 消息队列有如下几个好处,这大都是由其系统解耦消息缓存两点扩展而来的:

  • 提升系统可靠性:
    • 冗余:Process_B崩溃之后,数据并不会丢失,因为MQ多采用put-get-delete模式,即,仅当确认message被完成处理之后,才从MQ中移除message;
    • 可恢复:MQ实现解耦,部分进程崩溃,不会拖累整个系统瘫痪,例,Process_B崩溃之后,Process_A仍可向MQ中添加message,并等待Process_B恢复;
    • 可伸缩:有较强的峰值处理能力,通常应用会有突发的访问流量上升情况,使用足够的硬件资源时刻待命,空闲时刻较长,资源浪费,而消息队列却能够平滑峰值流量,缓解系统组件的峰值压力;
  • 提升系统可扩展性:
    • 调整模块:由于实现解耦,可以很容易调整,消息入队速率、消息处理速率、增加新的Process;
  • 其他:
    • 单次送达:保证MQ中一个message被处理一次,并且只被处理一次,本质:get获取一个message后,这一message即被预定,同一进程不会再次获取这一message,当且仅当进程处理完这一message后,MQ中会delete这个message,否则,过一段时间后,这一message自动解除被预订状态,进程能够重新预定这个message;
    • 排序保证:即,满足队列的FIFO,先入先出策略;
    • 异步通信:很多场景下,不会立即处理消息,这是,可以在MQ中存储message,并在某一时刻再进行处理;
    • 数据流的阶段性能定位:获取用户某一操作的各个阶段(通过message来标识),捕获不同阶段的耗时,可用于定位系统瓶颈。

##常用的消息队列

(doing…)

##小结

消息队列实现了进程间通信的升级,如下图所示:

##参考来源

 

分享到:
评论

相关推荐

    redis做消息队列

    Redis作为一个高性能的键值数据库,不仅在数据存储领域有广泛的应用,同时也被广泛地用于实现消息队列(Message Queue,MQ)。消息队列是分布式系统中的一种中间件,它允许不同组件之间异步通信,提高了系统的响应...

    基于Redis实现的简单消息队列

    1. **Redis消息队列的基本概念** - **生产者(Producer)**: 生产者是向消息队列中添加消息的组件。 - **消费者(Consumer)**: 消费者是从消息队列中取出并处理消息的组件。 - **消息(Message)**: 在队列中...

    PHP中利用redis实现消息队列处理高并发请求思路详解.rar

    首先,理解消息队列的基本概念。消息队列是一种异步处理机制,它允许应用程序将任务放入队列,而无需等待其完成。后台工作者会从队列中取出任务并执行,从而实现了请求的非阻塞处理。这样,前端可以快速响应用户,而...

    redisMq(按任务批次分不同队列)

    标题中的“redisMq(按任务批次分不同队列)”指的是使用Redis作为消息队列(Message Queue)系统,其中的任务被按照不同的批次分配到不同的队列中。这种设计旨在简化中间件的使用,例如替代了原本可能用到的KafkaMQ,...

    采用消息队列实现客户端与服务端的通信

    **消息队列的基本概念:** 1. **生产者(Producer)**:客户端或任何产生消息的组件,负责将消息放入消息队列。 2. **消费者(Consumer)**:服务端或其他处理消息的组件,从消息队列中取出并处理消息。 3. **消息...

    消息队列.zip

    在这个"消息队列.zip"压缩包中,虽然没有具体的内容可以详细分析,但我可以深入地解释一下消息队列的基本概念、工作原理以及它在实际应用中的优势。 消息队列(Message Queue, MQ)是分布式系统中常用的一种技术,...

    Python-一个由python写简单和容易使用的消息队列

    在Python中,有多个库实现了消息队列,如RabbitMQ、Redis、Kafka和Celery等。这些库通常基于AMQP(Advanced Message Queuing Protocol)或其他类似协议,提供了丰富的功能和灵活性。这里我们将主要讨论基于Python...

    Kafka深度解析.pdf

    #### 二、为什么使用消息队列(Message Queue) 消息队列作为中间件的一种,在现代分布式系统中扮演着重要角色。下面列举了一些使用消息队列的主要原因: 1. **解耦**:消息队列插入了一个基于数据的接口层,使得...

    消息队列概述

    消息队列(Message Queue, MQ)是一种软件组件,用于实现应用程序间的通信。它基于队列和发布/订阅模式,以异步方式传递消息,确保消息从生产者可靠地传递到消费者。这种机制允许不同应用程序之间进行解耦合操作,提高...

    05_知其然而知其所以然:如何进行消息队列的技术选型?.zip

    ”表明这是一篇关于深入理解消息队列(Message Queue, MQ)技术选型的文章,旨在帮助读者不仅理解如何使用MQ,还要理解为什么要选择特定的MQ方案。在Java开发中,消息队列是一个重要的中间件,用于解耦系统组件,...

    使用go和消息队列优化投票功能

    常见的消息队列如RabbitMQ、Kafka或Redis的发布/订阅模式都可以胜任此任务。使用消息队列可以有效地缓解高峰期的服务器压力,因为投票处理可以按照队列的顺序批量进行,避免了瞬时高流量对系统造成的冲击。此外,...

    一套多语言公用的消息队列和数据结构

    QUANTAXISMessageQueue-master这个压缩包文件名暗示这是一个与金融量化交易相关的项目,QUANTAXIS可能是该项目的名字,而MessageQueue可能是该项目的一个模块,专注于消息队列的功能。在金融领域,消息队列常用于...

    redis 老版本生产者消费者模式

    在实际项目中,虽然Redis的老版本生产者消费者模式简单易用,但随着Redis的发展,官方推荐使用更专业的消息队列服务如Redis Stream或第三方解决方案如RabbitMQ、Kafka等,它们提供了更丰富的功能和更好的性能保证。...

    golang实现redis的延时消息队列功能示例

    在本文中,我们将探讨如何使用Golang和Redis来...总的来说,Golang和Redis结合可以轻松地搭建一个延时消息队列的原型,适用于学习和快速验证概念。然而,对于生产环境,应评估其局限性并根据需求选择更适合的解决方案。

    基于消息队列的分布式爬虫——以电商产品数据为例.zip

    3. **消息队列(Message Queue)**:如RabbitMQ、Kafka或Redis等,作为中间缓冲区,存储待爬取的URL和爬取结果。它确保了即使在某些工作节点故障时,任务也不会丢失。 4. **解析器(Parser)**:对爬取到的网页内容...

    代码DEMO websocket mq redis pdf

    在WebSocket的应用中,通常会涉及到消息队列MQ(Message Queue)。MQ作为一个中间件,用于解耦应用程序,它接收、存储并转发消息,确保数据传输的可靠性和高效性。Java中常见的MQ实现有RabbitMQ、Apache Kafka和...

    Python中线程的MQ消息队列实现以及消息队列的优点解析

    消息队列在Python中的实现有多种方式,例如使用`multiprocessing`模块来支持多进程的消息传递,或者使用第三方库如RabbitMQ、Kafka或Redis等实现更复杂的消息队列服务。 消息队列具有以下优点: 1. **异步处理**:...

    SpringBoot集成常用开发中间件,分库分表,缓存,消息队列,定时器,权限管理等组件

    接着,"消息队列"(Message Queue,MQ)如RabbitMQ或Kafka,用于异步处理和解耦系统组件。SpringBoot提供了Spring AMQP或Spring Cloud Stream来处理消息队列。消息队列可以处理突发流量,防止系统雪崩,同时让各个...

    java+redis+秒杀项目实战.zip

    5. **队列(Queue)与消息队列(Message Queue)**:为了处理高并发下的订单创建,项目可能会利用RabbitMQ或Kafka等消息队列,将订单创建任务异步化,避免服务器因处理大量并发请求而过载。 6. **限流与降级策略**...

Global site tag (gtag.js) - Google Analytics