一、消息队列概述

1.什么是消息队列

MQ全称为Message Queue,即消息队列. 它也是一个队列,遵循FIFO原则 。同时也是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ,Redis等

2.为什么要使用消息队列

比如当我们需要调用三方接口时,我们没有办法预判三方接口的响应时效,假设三方服务挂掉了,可能导致我们的服务响应超时。

举个栗子,不知道各位坐地铁有没有注意到过,在刷天府通用三方支付的时候,只要你刷了闸机就会打开,可能要过一会才会弹出支付消息。就是说你在扫过码之后,付款并没有完成就可以出站。

如图

        提高系统响应速度

任务异步处理。 将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。 提高了应用程序的响应时间。

        提高系统稳定性

系统挂了关系,操作内容放到消息队列。

        服务调用异步化

服务没有直接的调用关系,而是通过队列进行服务通信

        服务解耦

应用程序解耦合,MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。

        排序保证 FIFO

遵循队列先进先出的特点

        消除峰值

异步化提速(发消息),提高系统稳定性(多系统调用),服务解耦(5-10个服务),排序保证,消除峰值

二、常见的消息队列及如何选择

1.常见的消息队列

现在比较常见的消息队列产品主要有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、RocketMQ等,这些技术背景或者特点各位感兴趣自行百度。

 2.如何选择

关于如何选择方案,还是要看具体的需求。在我们的设计中,MQ的功能与业务无关,因此优先考虑使用已有的中间件搭建。那么具本选择哪个中间件呢?先来梳理下我们对MQ的需求:

1.功能需求

如前文所述,除了最基本生产消费模型,还需要MQ能支持REQUEST-REPLY模型,以提供对同步调用的支持。 此外,如果MQ能提供PUBLISH-SUBSCRIBE模型,则事件代理的实现可以更加简单。

2.性能需求

考虑未来一到两年内产品的发展,消息队列的呑吐量预计不会超过 1W qps,但由单条消息延迟要求较高,希望尽量的短。

3.可用性需求

因为是在线服务,因此需要较高的可用性,但充许有少量消息丢失。

4.易用性需求

包括学习成本、初期的开发部署成本、日常的运维成本等。

3.横向对比

ActiveMQ与RabbitMQ在很多方面都很相似,但ActiveMQ对非JAVA生态的支持不及rabbitMQ, 这期主题会专门用RabbitMQ来举例。

特性

ActiveMQ

RabbitMQ

Kafka

RocketMQ

PRODUCER-COMSUMER

支持

支持

支持

支持

PUBLISH-SUBSCRIBE

支持

支持

支持

支持

REQUEST-REPLY

支持

支持

-

支持

API完备性

低(静态配置)

多语言支持

支持,JAVA优先

语言无关

支持,JAVA优先

支持

单机呑吐量

万级

万级

十万级

单机万级

消息延迟

-

微秒级

毫秒级

-

可用性

高(主从)

高(主从)

非常高(分布式)

消息丢失

-

理论上不会丢失

-

消息重复

-

可控制

理论上会有重复

-

文档的完备性

提供快速入门

首次部署难度

-

注: - 表示尚未查找到准确数据

摘自常用消息队列介绍和对比 - 腾讯云开发者社区-腾讯云

4.技术选型建议

  • 大数据场景,日志收集,实时性要求高,推荐Kafka
  • 金融领域,不能接受消息丢失或重复,推荐使用RocketMQ
  • 其他情况可以选择RabbitMQ

本期先到这里,下面几期会介绍如何搭建RabbitMQ以及如何在我们的项目中使用。

MQ消息队列(一)什么是消息队列相关推荐

  1. JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

    简介:JAVA应用开发MQ实战最佳实践--Series2:消息队列RocketMQ性能测试案例 往期内容 JAVA应用开发MQ实战最佳实践--Series1:RocketMQ综述及代码设计 1. 消息 ...

  2. php监听mq消息,客户端监听服务端获取rabbitmq消息队列,rabbitmq有消息的时候客户端刷新页面才能获取到消息,监听没起到作用,请求各位大神指点迷津...

    header("Content-Type:text/html;charset=utf-8"); use Workerman\Worker; require_once __DIR__ ...

  3. java如何保证mq一定被消费,RabbitMQ如何保证队列里的消息99.99%被消费?

    1. 本篇概要 其实,还有1种场景需要考虑:当消费者接收到消息后,还没处理完业务逻辑,消费者挂掉了,那消息也算丢失了?,比如用户下单,订单中心发送了1个消息到RabbitMQ里的队列,积分中心收到这个 ...

  4. linux qos mq,Pika + RabbitMQ:将basic_qos设置为prefetch = 1仍然会消耗队列中的所有消息...

    我有一个python工作者客户端,它可以让10个工人分别挂接到一个RabbitMQ队列中.有点像这样: #!/usr/bin/python worker_count=10 def mqworker(q ...

  5. 用户请求队列化_分布式消息队列选型分析

    高并发架构是成为架构师的必修课,而消息队列,则是王冠上最闪亮的那颗明珠!能否驾驭消息队列这款高并发神器,亦成为架构师的试金石.本文将从队列本质.技术选型两个方面,给大家整理下个人心得,希望能对大家有所 ...

  6. 何为消息队列,为何使用消息队列,有什么消息队列插件

    一.什么叫消息队列 MQ(Message Quene) : 翻译为 消息队列,通过典型的 生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息.因为消息的生产和消费都是异步 ...

  7. Kafka是什么,JMS是什么,常见的类JMS消息服务器,为什么需要消息队列(来自学习笔记)

    1.Kafka是什么  Apache Kafka是一个开源消息系统,由Scala写成.是由Apache软件基金会开发的一个开源消息系统项目.  Kafka最初是由LinkedIn开发,并于2011 ...

  8. tp5 mysql实现消息队列_TP5系列 | Queue消息队列

    消费信息如下ThinkPHP5 Queue消息队列 优点 1.Queue内置了 Redis,Database,Topthink ,Sync这四种驱动,本文使用Redis驱动 2.Queue消息队列适用 ...

  9. 消息队列面试 - 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?

    消息队列面试 - 如何保证消息不被重复消费? 面试题 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? 面试官心理分析 其实这是很常见的一个问题,这俩问题基本可以连起来问.既然是消费消息, ...

  10. 消息队列面试 - 如何保证消息的顺序性?

    消息队列面试 - 如何保证消息的顺序性? 面试题 如何保证消息的顺序性? 面试官心理分析 其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的 ...

最新文章

  1. 一招修复内存不能read_read文件一个字节实际会发生多大的磁盘IO?
  2. nested exception is java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource
  3. SELinux让php程序无法远程连接数据库
  4. Java 按行读写文件(解决中文乱码)
  5. C#中,控制台模式可以使用定时器吗?
  6. [Java] 蓝桥杯ADV-182 算法提高 前10名
  7. springboot2.0入门(helloworld)
  8. 论模式在领域驱动设计中的重要性
  9. python---小技巧
  10. 2021-2027全球与中国功能性涂层复合材料市场现状及未来发展趋势
  11. Ipone桌面计算机没了,苹果笔记本桌面图标不见了怎么办
  12. DBCO-PALA-g-PEG DBCO-聚硫辛酸-聚乙二醇
  13. 微信公众号 网页授权获取
  14. 超舒适!超强续航!南卡N2S蓝牙耳机全面评测!
  15. windows11 显示文件后缀名
  16. Charles软件破解方法
  17. NFT 的未来:对真实用例的可视化探索
  18. CCF中国开源大会开源雨林论坛丨七大亮点议题抢鲜看!
  19. linux实现局域网IP欺骗dns域名解析
  20. 老毛桃winpe u盘版安装win7

热门文章

  1. C# 上传本地文件到远程共享文件夹,从远程共享文件夹下载文件到本地
  2. 第三集 怪物学院 第十八章
  3. SQL server 2008 全代码
  4. python钉钉机器人定时发送消息服务器_用Python写一个定时提醒的钉钉机器人
  5. 转载:欧姆社 漫画学习统计学
  6. 解决nginx启动时域名解析失败而导致服务启动失败的问题【proxy_pass后面的域名进行DNS解析,解析失败则无法启动nginx】
  7. 模拟点击事件php,利用js脚本模拟鼠标点击事件
  8. prometheus监控nginx
  9. 如何在Flatter中以正确的方式存储登录凭证
  10. 信庭嵌入式工作室-嵌入式Linux漫谈之Linux系统