• 中间件、Kafka、Zookeeper


    消息队列

    软件下载

    链接: kafka下载

    Dubbo远程调用的性能问题

    Dubbo调用普遍存在于我们的微服务项目中,这些Dubbo调用全部是同步的操作,这里的"同步"指:消费者A调用生产者B之后,A的线程会进入阻塞状态,等待生产者B运行结束返回之后,A才能运行之后的代码。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3jkI5K6W-1668323632175)(day15/image-20220519152055211.png)]

    Dubbo消费者发送调用后进入阻塞状态这个状态表示该线程仍占用内存资源但是什么动作都不做,如果生产者运行耗时较久,消费者就一直等待,如果消费者利用这个时间可以处理更多请求,业务整体效率也会提升。

    实际情况下,Dubbo有些必要的返回值必须等待,但是不必要等待的服务返回值,我们可以不等待去做别的事情,这种情况下我们就要使用消息队列。

    什么是消息队列

    消息队列(Message Queue)简称MQ,也称:“消息中间件”,消息队列是采用“异步(两个微服务项目并不需要同时完成请求)”的方式来传递数据完成业务操作流程的业务处理方式。

    消息队列的特征

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VA0To4xN-1668323632176)(day15/image-20220519154952335.png)]

    常见面试题:消息队列的特征(作用)

    • 利用异步的特性,提高服务器的运行效率,减少因为远程调用出现的线程等待\阻塞时间。

    • 削峰填谷:在并发峰值超过当前系统处理能力时,我们将没处理的信息保存在消息队列中,在后面出现的较闲的时间中去处理,直到所有数据依次处理完成,能够防止在并发峰值时短时间大量请求而导致的系统不稳定。

    • 消息队列的延时:因为是异步执行,请求的发起者并不知道消息何时能处理完,如果业务不能接受这种延迟,就不要使用消息队列。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PpjDIbYt-1668323632177)(day15/image-20220906175358420.png)]

    常见消息队列软件

    • Kafka:性能好\功能弱,适合大数据量,高并发的情况,大数据领域使用较多。
    • RabbitMQ:功能强\性能一般,适合发送业务需求复杂的消息队列,java业务中使用较多。
    • RocketMQ:阿里的
    • ActiveMQ:前几年流行的,老项目可能用到

    消息队列的事务处理

    当接收消息队列中信息的模块运行发送异常时,怎么完成事务的回滚?

    当消息队列中(stock)发生异常时,在异常处理的代码中,我们可以向消息的发送者(order)发送消息,然后通知发送者(order)处理,消息的发送者(order)接收到消息后,一般要手写代码回滚,如果回滚代码过程中再发生异常,就又要思考回滚方式,如果一直用消息队列传递消息的话,可能发生异常的情况是无止境的,所以我们在处理消息队列异常时,经常会设置一个"死信队列",将无法处理的异常信息发送到这个队列中,死信队列没有任何处理者,通常情况下会有专人周期性的处理死信队列的消息。

    Kafka

    什么是Kafka

    Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。该项目的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。Kafka最初是由LinkedIn开发,并随后于2011年初开源。

    kafka软件结构

    Kafka是一个结构相对简单的消息队列(MQ)软件。

    kafka软件结构图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rjNzZRKI-1668323632178)(day15/image-20220519162807497.png)]

    Kafka Cluster(Kafka集群)。

    Producer:消息的发送方,也就是消息的来源,Kafka中的生产者;

    order就是消息的发送方,在Dubbo中order是消费者,这个身份变化了;

    Consumer:消息的接收方,也是消息的目标,Kafka中的消费者;

    stock就是消息的接收方,在Dubbo中stock是生产者,这个身份也变化了;

    Topic:话题或主题的意思,消息的收发双方要依据同一个话题名称,才不会将信息错发给别人。

    Record:消息记录,就是生产者和消费者传递的信息内容,保存在指定的Topic中。

    Kafka的特征与优势

    Kafka作为消息队列,它和其他同类产品相比,突出的特点就是性能强大。Kafka将消息队列中的信息保存在硬盘中,Kafka对硬盘的读取规则进行优化后,效率能够接近内存,硬盘的优化规则主要依靠"顺序读写,零拷贝,日志压缩等技术"。

    Kafka处理队列中数据的默认设置:

    • Kafka队列信息能够一直向硬盘中保存(理论上没有大小限制);
    • Kafka默认队列中的信息保存7天,可以配置这个时间,缩短这个时间可以减少Kafka的磁盘消耗。

    Kafka的安装和配置

    必须将我们kafka软件的解压位置设置在一个根目录,文件夹名称尽量短(建议直接把解压文件名改为kafka),然后路径不要有空格和中文。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GRZtb6ym-1668323632179)(day15/image-20220519165423916.png)]

    我们要创建一个名为data的空目录用于保存Kafka运行过程中产生的数据,下面进行Kafka启动前的配置。

    这是我电脑的配置,按照自己的做修改
    先到E:\kafka\config下配置有文件zookeeper.properties,找到dataDir属性修改如下:

    dataDir=E:/data
    
    • 1

    修改完毕之后要Ctrl+S进行保存,否则修改无效!注意E盘和data文件夹名称,匹配自己电脑的真实路径和文件夹名称。

    还要修改server.properties配置文件

    log.dirs=E:/data
    
    • 1

    修改注意事项和上面相同。

    启动kafka

    要想启动Kafka必须先启动Zookeeper

    Zookeeper介绍

    zoo:动物园

    keeper:园长

    可以引申为管理动物的人,Linux服务器中安装的各种软件,很多都是有动物形象的。

    如果这些软件在Linux中需要修改配置信息的话,就需要进入这个软件,去修改配置,每个软件都需要单独修改配置的话,工作量很大。我们使用Zookeeper之后,可以创建一个新的管理各种软件配置的文件管理系统,Linux系统中各个软件的配置文件集中到Zookeeper中,实现在Zookeeper中,可以修改服务器系统中的各个软件配置信息。长此以往,很多软件就删除了自己写配置文件的功能,而直接从Zookeeper中获取。

    Kafka就是需要将配置编写在Zookeeper中的软件之一,所以要先启动zookeeper才能启动kafka。

    Zookeeper启动

    进入路径E:\kafka\bin\windows

    输入cmd进入dos命令行

    E:\kafka\bin\windows>zookeeper-server-start.bat ..\..\config\zookeeper.properties
    
    • 1

    kafka启动

    总体方式一样,输入不同指令

    E:\kafka\bin\windows>kafka-server-start.bat ..\..\config\server.properties
    
    • 1

    附录

    Mac系统启动Kafka服务命令(参考):

    # 进入Kafka文件夹
    cd Documents/kafka_2.13-2.4.1/bin/
    # 动Zookeeper服务
    ./zookeeper-server-start.sh -daemon ../config/zookeeper.properties 
    # 启动Kafka服务
    ./kafka-server-start.sh -daemon ../config/server.properties 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Mac系统关闭Kafka服务命令(参考):

    # 关闭Kafka服务
    ./kafka-server-stop.sh 
    # 启动Zookeeper服务
    ./zookeeper-server-stop.sh
    
    • 1
    • 2
    • 3
    • 4

    在启动kafka时有一个常见错误

    wmic不是内部或外部命令
    
    • 1

    这样的提示,需要安装wmic命令,安装方式参考

    https://zhidao.baidu.com/question/295061710.html

  • 相关阅读:
    【block作为函数的参数 Objective-C语言】
    如何修改uni微信小程序editor组件和input组件的placeholder默认样式
    python基础-enumerate
    视频讲解|1033含sop的配电网重构(含风光可多时段拓展)
    C/C++树和图的应用
    更换有该包的软件源,如官方源,这个怎么更换
    java毕业设计成品基于JavaWeb酒店管理系统开发与设计[包运行成功]
    前端练习项目(附带页面psd图片及react源代码)
    解决 vite 4 开发环境和生产环境打包后空白、配置axios跨域、nginx代理本地后端接口问题
    AcWing 898. 数字三角形
  • 原文地址:https://blog.csdn.net/weixin_43121885/article/details/127832501