我们找工作的话,一般中高级开发就会被问到mq相关方面的一些问题

  1.什么是消息队列

 2.为什么要用消息队列

3.缺点有什么?

4.消息队列分别有哪些?

5.它们有什么区别?

一,什么是消息队列

 消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列互交。消息会保存在队列中,直到接收者取回它

  可以这样看 队列 从字面上来看   像不像是排好队的一队干饭人,食堂大妈给他们打饭,肯定时先到先打吧,排后面的先打到饭,肯定会引起混乱(先进先出) 

二,为什么要使用消息队列

   消息队列的核心就是 解耦、异步、削峰

1.解耦

 当服务之间 有互相调用的情况下    A服务要发一个消息到其它多个服务,每多一个服务要重新修改这个服务的相关代码,耦合性非常高,也妨碍服务横向扩张

当把这个消息发给消息队列时,需要消息的系统自己从消息队列中订阅,就不需要额外修改代码来处理这件事,也就做到了很好的解耦性

2.异步

当模块有引用其他模块时,a模块  调用了b 再调用了c 再调用了d  如果是同步进行的话  会非常耗时如果有一个中间件,a调用了中间件  就算调用成功了  b,c,d 订阅该消息  这样既加快了响应时间,又不会影响到相应的业务

3.削峰

很多网站访问都有高低峰   打车什么的,上下班肯定是高峰期,都知道我们数据库的连接读写资源是有限的,如果在高峰期的时候,大量数据一下涌进,可能会造成数据库连接的异常

如果请求先写入到中间件  再由服务根据自己数据库能处理的并发量去拉取这些消息,就可以很好的解决这些问题,但是难以避免会出现一些消息的积压

三.缺点

1.原来系统之间直接调用,现在加入mq这个中介,如果中介跑路了(挂掉了),那肯定也就就联系不上了,导致整个业务流程全部断线

2.A系统处理完了发送到消息对流后直接返回成功了,用户以为你这个请求就成功了;但是问题是,其他系统消费该消息后,如果当中有一个系统出现了问题,导致数据丢失。最后就会发生数据不一致等问题。

系统复杂性增加:要多考虑很多方面的问题,比如一致性问题、如何保证消息不被重复消费,如何保证保证消息可靠传输。因此,需要考虑的东西更多,系统复杂性增大。

四,消息队列分别有哪些?

ActiveMQ、RocketMQ、RabbitMQ、ZeroMQ、Kafka 等等等等,一般面试的时候能回答的出来这些就已经是可以的了,当然也有用redis来做这种消息中间件的(偷偷告诉你redis还可以用来做注册中心,redis要抗下所有,哈哈哈)

五,区别是什么?

 ActiveMQRabbitMQRocketMqKafkaZeroMQ
特点  功能齐全,被大量开源项目使用由于Erlang 语言的并发能力,性能很好   各个环节分布式扩展设计,主从 HA;支持上万个队列;多种消费模式;性能很好Kafka的Producer、Broker和Consumer之间采用的是一套自行设计的基于TCP层的协议。Kafka的这套协议完全是为了Kafka自身的业务需求而定制的,而非要实现一套类似于Protocol Buffer的通用协议低延时,高性能,最高 43万条消息每秒  
开发语言  JavaErlang  Java  scalaC
支持的协议  OpenWire、
STOMP、
REST、XMPP、
AMQP,MQTT
AMQP,STOMP,MQTT自己定义的一
套(社区提供
JMS--不成熟)
PLAINTEXT、SSL、SASL_PLAINTEXT、SASL_SSL。TCP、UDP
持久化  内存、文件、数据库内存、文件磁盘文件内存,文件,数据库在消息发送端保存
事务  支持不支持支持支持不支持
集群  支持支持支持支持不支持
负载均衡支持支持支持支持不支持
管理界面  一般无社区有 web
console   实现
部署方式  独立、嵌入独立独立独立独立
吞吐量万级万级10万级10万级10万级
时效性ms级us级ms级ms级以内 
评价  优点:
   成熟的产品,已经在很多公司得到应用(非大规模场景)。有较多的文档。各种协议支持较好,有多重语言的成熟的客户端;
缺点:
根据其他用户反馈,会出莫名其妙的问题,切会丢失消息。 其重心放到activemq6.0 产品—apollo 上去了,目前社区不活跃,且对 5.x 维护较少;
Activemq 不适合用于上千个队列的应用场景
优点:   由于erlang语言的特性,mq 性能较好;管理界面较丰富,在互联网公司也有较大规模的应用;支持amqp系诶,有多中语言且支持 amqp 的客户端可用
 
缺点:
  erlang语言难度较
大。集群不支持动态扩展。
优点:
   模型简单,接口易用(JMS   的接口很多场合并不太实用)。在阿里大规模应用。目前支付宝中的余额宝等新兴产
品均使用rocketmq。集群规模大概在50 台左右,单日处理消息上百亿;性能非常好,可以大量堆
积消息在broker   中;支持多种消费,包括集群消费、广播消费等。开发度较活跃,版本更新很快。
 缺点:
  没有在 mq 核心中去实现JMS 等接口,
高吞吐量:Kafka 每秒可以生产约 25 万消息(50 MB),每秒处理 55 万消息(110 MB)
  持久化数据存储:可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如 ETL,以及实时应用程序。通过将数据持久化到硬盘以及replication 防止数据丢失。
  分布式系统易于扩展:所有的 producer、broker 和 consumer 都会有多个,均为分布式的。无需停机即可扩展机器。
  客户端状态维护:消息被处理的状态是在 consumer 端维护,而不是由 server 端维护。当失败时能自动平衡。
调用的socket接口较多。
TCP是一对一的连接。
编程需要关注很多socket细节问题。
不支持跨平台编程。
需要自行处理分包、组包问题。
流式传输时需处理粘包、半包问题。
需自行处理网络异常,比如连接异常中断、重连等。
服务端和客户端启动有先后。
自行处理IO模型。
自行实现消息的缓存。
自行实现对消息的加密。

 

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐