消息队列之一:简介

本文分为二个部分来阐述 :
一、什么是消息队列
二、消息队列的常见应用场景

一、消息队列的概念
消息队列(Message Queue),简称MQ,从字面上其实就可以知道它的本质,是存储消息的队列,队列在大学数据结构的课程中我们已经接触过很多了(先进后出的存储结构),那什么是消息呢?消息可以是你的程序产生的任何数据,前提是你要把数据转换成消息队列可以接受的格式(序列化)。
下面是一段最简单的像消息队列发送消息的代码,在发送消息之前我们做了一系列的配置,其中就包括如何序列化你的消息(数据)。

public String sendMessege(){
    Properties properties = new Properties();
    properties.put("bootstrap.servers", "10.173.235.151:2181;10.173.235.152:2181;10.173.235.153:2181");
    properties.put("acks", "all");//是否接受确认码
    properties.put("retries", 2);//重试次数
    properties.put("batch.size", 16384);//批量发送的单位


    properties.put("linger.ms", 1);//最长等时间
    properties.put("buffer.memory", 33554432);//缓冲区
    properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    Producer<String, String> producer = null;
    try {
        producer = new KafkaProducer<String, String>(properties);
        producer.send(new ProducerRecord<String, String>("GANTRYFEE_UPLOADS_TEST", "i am transaction"));
        new ProducerRecord("1",2);
        return "success";
    } catch (Exception e) {
        e.printStackTrace();
        return "fail";
    } finally {
        producer.close();
    }


}

二、消息队列的应用场景
1.解耦
假设现在有一个A模块,负责的是采集高速公路车辆的通行数据,比如车牌号、车辆类型、通行费等。

现在B模块要获取车辆的通行数据的车牌号,A模块的人说好,我这边写一个接口给你,你调用就好。

过了不久C模块获取车辆的通行费,A模块的人说好,我这边写一个接口给你,你调用就好。
又过了不就D模块要获取车辆的车辆类型,A模块的人好,我这边写一个接口给你,你调用就好。
。。。。
循环往复开发A模块的人迟早都会被这些琐事搞炸,因为每一次接口在上线之前都要经过双方的沟通联调,往往开发的时间是占比很小的,那为什么不把车辆的通行数据都放在一个地方,然后各自去取呢,于是消息队列就出现了。


原始系统.png

A模块把所有的车辆通行数据发送到一个专门的地方,然后其他模块按需要从中取数据,这样A模块的人就不用因为每增加一个模块就要对系统进行改动了。


改进.png

2.异步
上边改进的后的架构是我在工作项目中存在的,但是通行数据不是像上边说的由B、C、D模块需要的时候才去取,而是要求实时处理这些数据。

原始系统.png

我们来看看这个架构下,实时处理的流程是怎么样的。
1首先A模块接受到一条数据后,调用发送数据给B模块的接口
2B模块接收到数据后,开始处理自己的业务,处理完之后,返回响应给A模块
3A模块根据B模块的响应码判断处理是否成功,处理成功则结束,不成功则要重新发送数据,循环往复。

这里存在的一个很大的问题就是B模块要先处理完数据才能通知A,那么如果这个处理时间很长的话,A模块的一个线程就会一直处于阻塞的状态等待B的返回,但是明明A模块的任务已经完成了,为什么要白白损耗性能等待B的返回呢?于是就有了异步的设计。


改进.png

这样流程就变为A模块把数据发送给消息队列,B模块订阅一个主题,当消息队列中存在数据时,B获取数据并处理,不成功时重新拉取数据,此时A时完全不用等待B的。这样A模块的的性能就上来了。

3.削峰/限流(流量控制)
当别人调用我们的接口时,我们在尽可能保证性能的同时最重要的是要保证我们的服务不被冲垮,但是我们又不可能不人道的把锅甩给其他模块的人,我们处理请求太慢就丢弃他们的请求,让他们重发,一个很好的思路就是当系统某一时刻处于瓶颈时,将请求都扔到消息队列中,系统挨个处理(是不是跟线程池的任务队列很像?其实思路都是一样的)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352