先吐槽

我真的写技术文章写到怀疑人生,我翻看历史发文记录,只要我一本正经的写的技术文章,都没人看,但是!一发闲扯淡的内容,阅读量肯定是技术文的好几倍(读者爸爸们别这么搞嘛)

这说明啥?说明学习还是太枯燥无趣了,但是你想想,每天就网上看闲扯淡的文章,这咋能进大厂嘛!对吧。

再接受几次这样的打击我都不想写技术文章了。哎!不过我也就嘴上说说,我还是会坚持写下去的。

反正你们有没有认真看我不知道,我写完一遍这个文章,每个知识点细节我都滚瓜乱熟了,因为都是我一个字一个字敲出来的。

开始正文吧!21世纪的流水线工人,消息队列是一定要会的。

我真的不能再贴心了!!!!

背景

image-20200420194331765

分布式微服务系统下,凡是可以“排队”去做的事情,都可以使用消息队列。网上买东西同样也需要“排队付款”,但是有人说,我点确认付款后马上就显示成功了,没感觉到排队呀?其实在后台系统中是排了,只不过排队的时间对于人来说有点短,可能1-2秒就结束了,但是对于计算机来说,这1-2秒的时间很长了。

大型分布式系统建设中,消息队列主要解决应用耦合、异步消息、流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。

Web应用程序毫无疑问有大量的代码执行HTTP请求/响应周期的一部分。这适用于更快的任务耗费数百毫秒内或更少。然而,有些处理,还需要耗时更多甚至最终会是一两秒钟缓慢的同步执行,在如此长时间的调用流转中,肯定有一些调用是可以不同步的,如下单送积分,用户下单是最主要的,送积分的操作可以异步去做,订单支付成功给用户的短信通知,返回支付订单进入下一环节更更好,短信通知可以异步去发送,为了应对诸如此类的异步操作,消息队列这门技术应运而生。

message-queue-example

在计算机科学中,消息队列(Message queue)是一种进程间通信或同一进程的不同线程间的通信方式。实际上,消息队列常常保存在链表结构中。[2]拥有权限的进程可以向消息队列中写入或读取消息。

目前,有很多消息队列有很多开源的实现,包括JBoss Messaging、JORAM、Apache ActiveMQ、Sun Open Message Queue、RabbitMQ[3]、IBM MQ[4]、Apache Qpid[5]、Apache RocketMQ[6]和HTTPSQS。[7]

说了这么多没用的,消息队列到底在企业里怎么用的?

我就直接上两段代码吧

发送一条消息demo

public class MqProducer {private final Logger LOG = LoggerFactory.getLogger(MqProducer.class);@Resourceprivate Producer payProducer;public void sendPayMsg(String msg) {try {LOG.debug("send msg:{}", msg);payProducer.send(msg);//发送出去一条消息。} catch (MQException e) {LOG.error("mq消息异常 message:{}", msg, e);}}
}

接收一个消息demo

public class DemoConsumer {/*** 注意:服务端对单ip创建相同主题相同队列的消费者实例数有限制,超过100个拒绝创建.* */private static IConsumerProcessor consumer;public static void main(String[] args) throws Exception {Properties properties = new Properties();properties.setProperty(ConsumerConstants.SubscribeGroup, "dache.risk.log.queue.v2");// 创建topic对应的consumer对象(注意每次build调用会产生一个新的实例)consumer = KafkaClient.buildConsumerFactory(properties, "topic.xxx.xxx");// 调用recvMessageWithParallel设置listenerconsumer.recvMessageWithParallel(String.class, new IMessageListener() {@Overridepublic ConsumeStatus recvMessage(Message message, MessagetContext context) {//TODO:业务侧的消费逻辑代码try {System.out.println("message=[" + message.getBody() + "]  partition=" + message.getParttion());} catch (Exception e) {e.printStackTrace();}return ConsumeStatus.CONSUME_SUCCESS;}});}
}

消息长什么样子?

{"businessType":1,"cityId":10,"ctime":1567426767077,"dataKey":20190902,"logType":1,"phone":"13212341234","uid":12345678,"userType":1,"uuid":"32EA02C86D78863"}

代码呢,就是普通的java代码,只不过引入了一个kafka的jar,消息就是json串,使用消息队列真的就这么点代码,剩下的内容都是业务代码了。

新手关注消息队列,主要关注两个最重要的概念就行了,一个是生产者,一个是消费者,两者的关系和我们日常发短信一样,短信是通过手机号发送接收,系统间消息是通过topic,可以理解成手机号。

  • Producer消息的生产方,如支付系统确认用户已经支付,支付系统要通知订单系统和物流系统,支付系统就是生产者。

  • Consumer消费的接收方,Producer 的案例中,物流系统就是消费方,前两个都比较简单,我就不多说了。

  • Topic每条发布到MQ集群的消息都有一个类别,这个类别被称为topic,可以理解成一类消息的名字。所有的消息都以topic作为单位进行归类。

日常开发中需要关心哪些指标

1.生产消息数目

每分钟几百几千个都正常水平吧,业务繁忙的每分钟几万几十万也是有的

image-20200420193350371

2.消息延迟情况

延迟越低越好啦,几百毫秒正常水平。

image-20200420193540766

3.消息积压数

这个当然是要0了,如果遇到消费端服务器上线,可能会有段时间积压正常,这个指标,日常应该都是0才对。

image-20200420194052328

为什么使用消息队列

开头不是说了,排队能解决一个问题,就是削峰,意思就是流量洪峰来了,收银员结账速度依旧是一样的,不会被累死,还有两个重要的概念就是解耦异步

使用消息队列有什么缺点呢?

这个新手也一定要知道啦,因为面试官会问。

  1. 消息丢失问题: 任何系统不能保证万无一失,比如 Producer 发出了10000条消息,Consumer 只收到了 9999 个消息,有1个丢了,Consumer 能否接受丢一条?如果是订单成功短信可以接受丢一条,就是有一个顾客没有通知到已经发货,但货还是发出去了,如果是支付系统,用户已经付款却因为消息丢失没有通知到订单或物流系统,那恐怕顾客要找你麻烦了。

  2. 消息重复问题:如 Producer 发出了10000条消息,Consumer 只收到了 10001 条消息,有一条是重复的,业务能否接受一条重复的消息,这个是作为系统设计者要考虑的问题。

  3. 消息的顺序问题:如 Producer 发送顺序是123,Consumer 收到的消息是132,要考虑消费端是否对顺序敏感。

  4. 一致性问题: 如消息丢失问题真的发生且无法找回,会造成两个系统的数据最终不一致,如果消息延迟,会造成短暂不一致。

ActiveMQ vs Kafka vs RabbitMQ

RabbitMQ、Kafka和ActiveMQ都是用于提供异步通信和解耦进程(分离消息的发送方和接收方)的消息传递技术。

它们被称为消息队列、消息代理或消息传递工具。RabbitMQ、Kafka和ActiveMQ都有相同的基本用途,但它们的工作方式不同。Kafka是一个高吞吐量的分布式消息传递系统。

RabbitMQ是一个基于AMQP的可靠消息代理。ActiveMQ和Kafka都是Apache的产品,都是用Java编写的,RabbitMQ是用Erlang编写的。

进BAT你就研究这其中一个就可以了,数量不在多,重点是深度。

ActiveMQ,Kafka和RabbitMQ有哪些替代方案?

这些在国内都不是很常用,新手了解一下就可以了,反正,知识广度&眼界是有了。

  1. Apollo:在现有REST API的基础上构建一个通用的GraphQL API,可以快速发布新的应用程序特性,而无需等待后端更改。

  2. IBM MQ:它是一个消息传递中间件,可以简化和加速跨多个平台的不同应用程序和业务数据的集成。它提供了经过验证的企业级消息传递功能,能够熟练而安全地移动信息。

  3. ZeroMQ:扩展性好,开发比较灵活,采用C语言实现,实际上他只是一个socket库的重新封装,如果我们做为消息队列使用,需要开发大量的代码

  4. Amazon SQS

关于消息队列的常见面试题

  1. 为什么使用消息队列?

  2. 消息队列有什么优点和缺点?

  3. 那为什么Kafka的吞吐量远高于其他同类中间件?

  4. 比较重要的关键字吗?比如ProducerConsumer,Partition,Broker,你都是怎么理解的?

参考资料

  1. Thorough Introduction to Apache Kafka

  2. 推荐一本书《深入理解Kafka:核心设计与实践原理》,微信读书就可以免费阅读。

扫盲消息队列 | 消息中间件 | Kafka相关推荐

  1. 2021年大数据Kafka(一):❤️消息队列和Kafka的基本介绍❤️

    全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 消息队列和Kafka的基本介绍 一.什么是消息队列 二.消息队列的应用场景 ...

  2. 消息队列之Kafka

    背景:Dubbo远程调用的性能问题 Dubbo调用普遍存在于我们的微服务项目中, 这些Dubbo调用全部是同步的操作, 这里的"同步"指:消费者A调用生产者B之后,A的线程会进入阻 ...

  3. Cris 玩转大数据系列之消息队列神器 Kafka

    Cris 玩转大数据系列之消息队列神器 Kafka Author:Cris 文章目录 Cris 玩转大数据系列之消息队列神器 Kafka Author:Cris 1. Kafka 概述 1.1 消息队 ...

  4. “简单”的消息队列与kafka

    小时候就特别喜欢龙系精灵,特别是乘龙,后来才知道只是冰水...尴尬. 在宠物小精灵中,乘龙一直是训练家的载人伙伴,和我们下面的MQ好像有几分相似呢~~ 前言 MQ,全称消息队列,现在市面上有很多种消息 ...

  5. python消息队列celery_消息队列(kafka/nsq等)与任务队列(celery/ytask等)到底有什么不同?...

    写这篇博文的起因是,我在论坛宣传我开源的新项目YTask(go语言异步任务队列)时,有小伙伴在下面回了一句"为什么不用nsq?".这使我想起,我在和同事介绍celery时同事说了一 ...

  6. 【消息队列】kafka是如何保证消息不被重复消费的

    一.kafka自带的消费机制 kafka有个offset的概念,当每个消息被写进去后,都有一个offset,代表他的序号,然后consumer消费该数据之后,隔一段时间,会把自己消费过的消息的offs ...

  7. 消息队列_消息队列:kafka

    概念 kafka是一个分布式的基于发布/订阅模式的消息队列,主要用于大数据实时处理领域. 要理解kafka首先要有分布式的概念,要有消息队列的概念.分布式系统最大的优势就是解耦和削峰,这种情况下,A系 ...

  8. 消息队列之kafka面试题

    1.什么是kafka Kafka是分布式发布-订阅消息系统,它最初是由LinkedIn公司开发的,之后成为Apache项目的一部分,Kafka是一个分布式,可划分的,冗余备份的持久性的日志服务,它主要 ...

  9. Java开发 - 消息队列之Kafka初体验

    目录 前言 Kafka 什么是Kafka Kafka软件结构 Kafka的特点 怎么启动Kafka 下载Kafka 配置Kafka Zookeeper 启动Kafka Kafka案例 添加依赖 添加配 ...

最新文章

  1. (筆記) 如何安裝Altera USB Blaster? (SOC) (Quartus II) (DE2)
  2. java io 文件复制_实例讲述Java IO文件复制
  3. 【蓝桥杯省赛】冲刺练习题【动态规划】倒计时【08】天
  4. LibreOJ #103. 子串查找
  5. 2018 浅谈前端面试那些事
  6. 音视频技术开发周刊 75期
  7. 机房网络 与 LVS
  8. ebs oracle 落伍了吗_向不了解oracle EBS的人介绍Oracle EBS
  9. 系统日志之logger命令
  10. bzoj 2850 巧克力王国 —— K-D树
  11. PHP魔术方法和魔术变量总结
  12. 提高网站访问速度的方法汇总
  13. C++基础习题(计算三角形斜边)
  14. mysql的auto_increment详解
  15. 移动apn接入点哪个快_提升移动联通电信网速
  16. 2020美赛赛后感想总结
  17. 信安专业学生-必考认证证书( 2023.1-6月 CISP/NISP考试安排)
  18. 2022最新网络安全零基础学习路线
  19. JSP页面禁用EL表达式的原因和实现方法
  20. 《大话设计模式》—— 读后感 (12)牛市股票还会亏钱?—— 外观模式

热门文章

  1. [leetcode]347. Top K Frequent Elements
  2. 周报_2013第03周(2013/01/13-2013/01/19)
  3. [设计模式]桥接模式
  4. 最后的代课老师———漆红玉[转]
  5. Linux操作系统下Sudo命令的使用方法说明
  6. 怎样制作滴滴截图_滴滴老了吗?
  7. java对象实例化的方式
  8. VMware Workstation All Key
  9. 二进制安装mariadb-10.2.8
  10. 如何在画面中摆放大量图片