架构师进阶之一消息中间件RabbitMQ和Kafka比较_hanruikai的博客-程序员秘密

技术标签: 架构设计  架构师之路  

为什么需要消息中间件

  • 异步任务处理
  • 系统解构,微服务直接解耦通信的一种方式,不关心系统语言编码实现
  • 流量削峰

常用的MQ技术

1. RabbitMQ

1. 1 基于Erlang语言开发。

Erlang是一种面向并发(Concurrency Oriented),面向消息(Message Oriented)的函数式(Functional)编程语言。面向并发技术关键点意味着线程切换成本要低Erlang并没有传统意义的操作系统的进程和线程的概念,它定义一个运行实体叫Process。Process之间通信不共享任何资源,不需要任何锁机制,减少开销。仅仅依靠消息进行通信

这样对于临界资源呢? 是不是也就是串行处理了呢?Erlang其实实现高并发关键在于Prcoess的构建,轻量级的,创建销毁快速,之间切换资源消耗低。那么我们java语言中的thread为什么创建销毁,相互切换资源消耗多呢?

Erlang语言与java在并发方面不同​​​

为什么java不能利用这么轻量级的Process机制呢?

java是用户线程,通过一定规则映射到native thread,依赖操作系统的原生线程,之前jdk1.0曾经用过绿色线程,后来舍弃了。

所以java线程的切换,因为需要映射到navtive thread,所以导致操作系统在内核态和用户态切换,资源消耗相对绿色线程多。

erlang使用的是绿色线程。优势是绿色线程是应用级别的线程,可以在不支持线程的OS上使用。缺点是不能利用cpu的多核机制。

CPU和线程数的关系

cpu多核和线程数目什么关系?查看cpu信息,一个socket代表cpu的物理个数,cores per socket代表一个cpu有多个core,每个core一般是1个线程,如果支持超线程技术就是2个线程。所以总的线程数目就是cpus的值,也就是4.

CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1

Erlang语言特性      

  • Everything is a process.
  • Processes are strongly isolated.
  • Process creation and destruction is a lightweight operation.
  • Message passing is the only way for processes to interact.
  • Processes have unique names.
  • If you know the name of a process you can send it a message.
  • Processes share no resources.
  • Error handling is non-local.
  • Processes do what they are supposed to do or fail

1.2 架构

  • 生产者发送消息,经过channel到达exchage分发器。exchage根据类型,比如direct,fanout,topic分到对应队列,也可能是动态队列
  • Rabbitmq的架构依赖exchage进行分发,性能难免受限制。Kafka是直接分发到topic(rabbitmq叫队列)上
  • 如果队列不设置持久化,消息只存在内存中,可能丢失
  • 消息如果被消费掉会删除
  • Kafka指定消息,通过key进行hash找到分片,然后读取消息。但是Rabbitmq不是,是集中代理,然后路由分发。大部分工作依赖代理去做。

2 Kafka

2.1 生产者分析

  • Kafka对所有对消息进行分类,存储在topic,topic是分片存储的,之所以分片存储,主要是考虑性能问题,类似于redis的分片,大数据文件进行hash拆分,一个道理。分片之后每个数据片都有单点故障问题,所以每个分片都有多个副本,存储在其他节点。可以用副本因子指定副本个数
  • 生产者发送消息,根据消息的key进行hash,然后分配到指定对分片,如果希望多个消息到同一个分片,需要相同到key
  • 消息到达某个topic后,以分布式日志的形式append log存储,存储有个id,称之为offset,将来可以根据offset任意定位消息。log会分segment,也是性能考虑。kafka是依靠磁盘存储日志的,rabbitmq是依赖内存。
  • kafka因为是存储到磁盘文件,所以利用的是顺序IO读取,所以性能较高,避免随机IO读取

图片来自:https://blog.csdn.net/qq_29186199/article/details/80827085

2.2 消费端分析

消费消息时,有两种模型,一种是pull,消费者主动拉取消息。一种是push,消息代理推送消息给消费者。

  •  push:优势在于消息实时性高。劣势在于没有考虑consumer消费能力和饱和情况,容易导致producer压垮consumer。
  •  pull:优势在可以控制消费速度和消费数量,保证consumer不会出现饱和。劣势在于当没有数据,会出现空轮询,消耗cpu

  kafka采取拉取模式,rabbitmq采用的是push模型。并采用可配置化参数保证当存在数据并且数据量达到一定量的时候,consumer端才进行pull操作,否则一直处于block状态。kakfa采用整数值consumer position来记录单个分区的消费状态,并且单个分区单个消息只能被consumer group内的一个consumer消费,维护简单开销小。消费完成,broker收到确认,position指向下次消费的offset。由于消息不会删除,在完成消费,position更新之后,consumer依然可以重置offset重新消费历史消息。

2.3 总结

  • Kafka消息存储主要依赖磁盘,不是内存,内存成本高,磁盘相对廉价
  • Kafka根据topic进行数据分片存储,性能高,而且可靠,通过副本因子决定副本数
  • Kafka的消息在topic分片内部通过分布式日志存储,生成id,也就是offset,将来可以直接根据offset读取消息。也可以顺序读取消息 。在顺序读取消息的时候,记录当前读取的offset。下次直接根据offset读取,所以kafka的offset可以直接寻址消息,存储结构应该是数组实现的队列,不是Btree。
  • 消费者通过pull方式拉取数据,速率可控,可以消费历史消息
  • 消息即时被消费过,也不会删除,依赖过期时间
  • 消费者分group,每个消息只能被同一个group的一个consumer消费掉。依赖zookeer进行rebalance,如果出现节点fail的情况
  • kafka更加适合于消息比较多的情况,可以有效防止consumer无法及时消费消息。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hanruikai/article/details/87346576

智能推荐

SAP物料移动科目确认由浅入深无敌大解析_ysi property pay_sap财务新手的博客-程序员秘密

我们知道SAP中,当物料价值移动时,会产生多种价值差异,那么一般SAP中存在哪些差异和如何处理这些差异呢,下面就解释一下我所了解目前SAP的处理方式。前提:一些前提的配置解释:1、Valuation Level(评估级别):TCODE: OX14评估级别:对物料的成本核算范围,一般是基于工厂级别或者基于公司代码级别的。如选择默认的评估区域是工厂的话,下面举个

免费超大量邮件发送服务,Kewail提供SMTP和API支持_kewail_robin的博客-程序员秘密

一般来说网站注册、论坛消息、新闻推送、广告宣传等都会有发送邮件服务,用kewail平台发送邮件,可以保证邮件到达率,同时适合超大量的邮件发送服务。Kewail是专业级别的邮件发送服务,能够满足企业或者个人每天超大量邮件发送服务,并且保证邮件足够的到达率,如果你愿意付费的话,可以极低价格发送每天上百万封的邮件。Kewail平台邮件API接口,邮件SMTP、高可用,高并发;高效稳定的邮件接口服务,...

李阳和他的疯狂英语_小麦苗DBA宝典的博客-程序员秘密

今天在翻看之前在人人网中的日志时,发现一篇关于的文章引起了我的注意,我觉得还是有必要和大家分享下的,这篇文章算是一个私人评论,来源是出自eygle的一篇转载。http://ww...

java代码实现如何获取当前经纬度?(安卓的话可以用GPS取)_adknuf1202的博客-程序员秘密

import android.app.Activity;import android.os.Bundle;import android.location.*;import android.content.*;import android.util.Log;import android.widget.TextView; public class GPSLo...

harmonyos 2.0名单,鸿蒙os2.0系统支持机型有哪些?鸿蒙os2.0系统适配名单分享_Lunarnai的博客-程序员秘密

鸿蒙os2.0系统将会在12月16日正式发布,那么这款系统将会由哪些机型首发搭载?适配机型有哪些?小编为大家带来最新的手机资讯,快来看看吧。很多用户都很期待这个操作系统,那么这个系统可以适配的机型有哪些呢?有哪些机型可以更新这个系统呢?那么就让我们一起来看看这个系统的适配名单吧!方便用户可以更好为自己的手机更新系统做好打算,方便用户更好的使用。鸿蒙os2.0系统支持机型有哪些?鸿蒙os2.0系统适...

c语言如何输入输出string类型的数据_c语言输入string类型_翱翔&天际的博客-程序员秘密

一般C语言中输入字符串要么使用字符数组,要么使用字符指针;但有时在C++中用到string类型,而为了节省程序运行过时间经常使用c中的标准输入输出scanf()和printf() ,但是c中没有string类型,那么怎样输入输出字符出串类型呢?c++为了兼容c做出如下可行方法:#include<bits/stdc++.h>using namespace std;in...

随便推点

多任务学习经典品读:MMoE模型篇_kaiyuan_sjtu的博客-程序员秘密

作者|知乎博主@青枫拂岸整理|NewBeeNLP今天带来是Google发表于KDD2018,针对于多任务推荐的经典模型MMOE。论文:Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts地址: https://dl.acm.org/doi/10...

tensorflow.keras损失函数的标准格式及包装(损失函数传参方法)_tensorflow.keras.losses_there2belief的博客-程序员秘密

tensorflow.keras官方标准格式的损失函数包括损失函数本身和一个包装函数,使用时可以直接使用损失函数本身。以tensorflow_core/python/keras/losses.py(tf1.15)中的交叉熵损失函数为例,包括损失函数本身categorical_crossentropy和包装函数CategoricalCrossentropy,包装函数本身参数更多,例如reduction,并实现对y_true和y_pred参数的包装。 在使用时,不带参数时,可以...

Pixy通过TTL转USB与电脑串口调试助手显示坐标_ttl串口助手_师英杰的博客-程序员秘密

首先根据基础视频教程教会Pixy一种颜色,将通讯方式改为UART,波特率改为19200,具体设置页面如下: 2. 将牛角座线序弄清楚,如下图: 3. 串口模块上有排针脚TXD,RXD,GND,将串口模块的TXD与上图的RXD相连,将串口模块的RXD与上图的TXD相连,GND直接连接。 4. 之后打开串口调试助手,或者串口猎人,将波特率设置为19200,其余不变,找到串口并打开,如果没有

关于ValueError: cannot convert float NaN to integer的有效解决办法_府学路18号车神的博客-程序员秘密

最近写的代码漏洞百出,困扰于ValueError: cannot convert float NaN to integer已经有很多大佬做了相应的解答,汇总一下吧!~python2与python3中关于对NaN类型数据的判断和转换ValueError: cannot convert float NaN to integer解决办法成功解决ValueError: cannot convert float NaN to integer坚持读Paper,坚持做笔记,坚持学习!!!

SpringContextHolder获取bean实例_weixin_42868638的博客-程序员秘密

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Thinkingcao/article/details/81744448 package com.thinkingcao.common.utils; import ja...

N-Gram 分词算法 Python 实现_n-gram python_刘坏坏的博客-程序员秘密

概述N-Gram 算法是一种单词级别的窗口取词算法,N-Gram(有时也称为N元模型)是自然语言处理中一个非常重要的概念,通常在NLP中,人们基于一定的语料库,可以利用N-Gram来预计或者评估一个句子是否合理。另外一方面,N-Gram的另外一个作用是用来评估两个字符串之间的差异程度。这是模糊匹配中常用的一种手段。N-Gram 算法具体过程:过滤掉文本数据中的标点符号和其他特殊字符;对所有单词执行小写转换,并删除单词之间的空格、换行符等标志位;使用长度为 N 的窗口对文本内容执行字符级

推荐文章

热门文章

相关标签