消息中间件设计——解耦业务系统与核心系统

消息中间件设计——解耦业务系统与核心系统

同步和异步

什么是同步?什么是异步?

同步与异步指的是消息通信机制

  1. 同步 在发出一个调用后 没有得到的结果之前,该调用不返回,即调用者主动等待这个调用的结果。

  2. 异步 与同步相反,在调用发出后直接返回结果。即在一个异步调用发出后,调用者立刻去做其他事情。

为什么需要消息中间件?

业务系统和核心系统的交互比较频繁,系统之间耦合度太高。核心系统和业务系统有很多重复的开发工作。所以此时需要对它们进行解耦,让各个业务系统能健康的发展。

  1. 什么是消息中间件,有什么作用?
    1. 消息中间件就是一个开发好的系统,可以独立部署,业务系统通过它来发消息和收消息。以达到异步调用的效果。
    2. 消息中间件 可以提升系统性能。
    3. 系统解耦
    4. 大流量消峰
生产级消息中间件的选型?

kafka的优缺点

  1. 支持高吞吐量
  2. 性能较高
  3. 支持集群部署
  4. 有可能丢失数据
  5. 功能比较单一

RabbitMQ的优缺点

  1. 能保证不丢失数据
  2. 能保证高可用
  3. 支持很多高级功能 如重试、死信队列。
  4. 吞吐量比较低
  5. 集群线性扩展比较麻烦
  6. 开发语言是Erlang

RocketMq的优缺点

  1. 吞吐量很高
  2. 能保证高可用、高性能
  3. 保证数据绝对不丢失
  4. 支持大规模集群部署,线性扩展方便
  5. 支持各种高级功能,如延迟消息,消息回溯等
  6. 支持各种高级功能,如延迟消息,消息回溯等
  7. 基于Java语言的开发,能满足 国内绝大部分公司技术栈。
RocketMQ架构原理
  1. NameServer 和bROKER

  2. NameServer是RocketMQ的路由中心,主要提供管理、服务注册及服务发现功能。

  3. Broker是由RocketMQ的核心模块,主要提供消息的接受、存储和拉取等功能

  4. 如何保证高可用?

    1.RocketMQ中的数据是分布式存储在Broker中的,如果右节点宕机,那么RocketMQ是如何保证数据不丢失的呢?

    1. 采用多副本的方式,RocketMQ采用主从架构及多副本策略,来保证Broker数据的高可用
  5. NameServer如何感知Broker的健康状态。

    1. Broker在启动后会自动向所有的NameServer急求你注册,这样所有的NameServer节点都知道了这个Broker。业务系统可以通过Nameserver集群拉取Broker,从而进行消息的发送/获取。
引入消息中间件会带来什么问题?

利用消息中间件能解决系统的各种瓶颈问题,但也会提高系统的复杂度,所以需要解决消息中间件自身的各种问题,这可能会导致降低系统的可用性及稳定性。

RocketMQ的高可用方法

RocketMQ主要采用镜像集群模式来保证高可用,能够百分之百保证数据不丢失。与RabbitMQ的普通集群模式不同,在RabbitMQ的镜像集群模式下,所创建队列queue中的消息及元数据都存在多个RabbitMQ实例上。即在所有的RabbitMQ节点上都有这个queue的完整镜像,在写入消息时会将消息同步到多个mirror queue中。

优点: 在任何一台机器宕机,其他机器还保留了queue的完整消息数据,这样Consumer就可以去其他好的节点上消费信息。

缺点: 性能开销较大,因为消息需要同步到所有节点,所有网络传输消耗很大

kafka的高可用方案

kafka由多个Broker组成,每个Broker就是一个节点。一个Topic可用被划分为多个Partition。Partition可用存在于不同的Broker节点上,每个Partition只存放一部分数据。

如何保证消息不被重复消费?

要完全避免重复消费消息是很难做到的,因为网络的抖动、机器的宕机和处理的异常都是难以避免的。

  1. 生产过程中 可用给每个生产者定义一个唯一的ID
    1. 给生产的每一条消息 定义一个唯一的ID
    2. 消息中间件服务端村消息时,存储生产者ID与最后一条消息ID映射。如果在生产出一条新消息后,消息中间件服务端会先将消息ID与其存储的最后一条消息ID进行对比。如果相等 则是重复消息 。如果不相等,则进行存储。
  2. 消费过程中
    1. 给消息生成一个唯一的ID,在消息消费后将数据ID存到数据库中
    2. 在消费下一条消息前,现在数据库中查询是否有这个消息ID,如果有则是重复消息,不处理。
如何保证消息的顺序性?

在Topic中,一个Partition对应一个Consumer,只能单线程消费。对性能及并发要求稍微高的场景中就很不合适了,因为单线程吞吐量效率太低。

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

推荐阅读更多精彩内容