入门

MQ

1、message queue

2、本质队列,FIFO 先入先出

3、一种跨进程的通信机制,用于上下游传递消息

(1)在互联网架构中,MQ 是一种上下游“逻辑解耦 + 物理解耦”消息通信服务

(2)使用 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务

4、作用

(1)流量消峰

(2)应用解耦

(3)异步处理

 

Kafka

1、大数据的消息中间件,百万级 TPS

2、优点

(1)单机写入 TPS 约在百万条 / 秒,吞吐量高

(2)时效性 ms 级,可用性非常高

(3)分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用

(4)消费者采用 Pull 方式获取消息,消息有序,通过控制能够保证所有消息被消费且仅被消费一次

(5)第三方 Kafka Web 管理界面 Kafka-Manager

(6)在日志领域比较成熟,被多家公司和多个开源项目使用

(7)功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算、日志采集被大规模使用

3、缺点

(1)单机超过 64 个队列 / 分区,Load 会发生明显的飙高现象,队列越多,Load 越高,发送消息响应时间变长,使用短轮询方式,实时性取决于轮询间隔时间,消费失败不支持重试

(2)支持消息顺序,但是一台代理宕机后,就会产生消息乱序

(3)社区更新较慢

4、适用

(1)基于 Pull 模式处理消息消费,追求高吞吐量,用于日志收集、传输

(2)适合产生大量数据的互联网服务的数据收集业务,有日志采集功能首选

 

RocketMQ

1、开源,Java 语言实现,参考、改进 Kafka

2、优点

(1)单机吞吐量十万级,可用性非常高

(2)分布式架构,消息可以做到 0 丢失

(3)功能较为完善,扩展性好,支持 10 亿级别的消息堆积,不会因为堆积导致性能下降

3、缺点

(1)支持的客户端语言不多,目前是 Java、C++,其中 C++ 不成熟

(2)社区活跃度一般

(3)没有在 MQ 核心中实现 JMS 等接口,有些系统要迁移需要修改大量代码

4、适用

(1)金融互联网

(2)对于可靠性、稳定性要求很高的场景

 

RabbitMQ

1、在 AMQP(高级消息队列协议)基础上完成,可复用的企业消息系统

2、优点

(1)由于 erlang 语言的高并发特性,性能较好

(2)吞吐量到万级,MQ 功能比较完备、健壮、稳定、易用、跨平台、支持多种语言,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持 AJAX,文档齐全

(3)开源提供的管理界面

(4)社区活跃度高,更新频率相当高

3、缺点

(1)商业版需要收费

(2)学习成本较高

4、适用

(1)结合 erlang 语言本身的并发优势,功能比较完备,时效性微秒级,社区活跃度比较高,管理界面十分方便

(2)数据量没有那么大,中小型公司优先选择

 

高级消息队列协议

1、AMQP:Advanced Message Queuing Protocol

2、一个网络协议,类比 HTTP

3、应用层协议的一个开放标准,为面向消息的中间件设计

4、基于此协议的客户端与消息中间件可传递消息,并不受客户端 / 中间件不同产品,不同的开发语言等条件的限制

 

Java 消息服务

1、JMS:JavaMessage Service

2、应用程序接口,是一个 Java 平台中关于面向消息中间件的 API

3、JMS 是 JavaEE 规范中的一种,类比 JDBC

4、RabbitMQ 官方没有提供 JMS 的实现包,开源社区有 JMS 实现包 

 

RabbitMQ 概念

1、生产者

(1)产生数据发送消息的程序

2、交换机

(1)RabbitMQ 的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中

(2)交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列,还是推送到多个队列,或者是把消息丢弃,由交换机类型决定

3、队列

(1)RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ、应用程序,但它们只能存储在队列中

(2)队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区

(3)许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据

4、消费者

(1)消费者大多时候是一个等待接收消息的程序

5、同一个应用程序既可以是生产者,又是可以是消费者

6、Broker

(1)接收、分发消息的应用

(2)RabbitMQ Server 就是 Message Broker

7、Virtual Host

(1)出于多租户、安全因素设计,把 AMQP 基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念

(2)当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个 vhost,每个用户在自己的 vhost 创建 Exchange/Queue 等

(3)如 MySQL 拥有数据库的概念,并且可以指定用户对库和表等操作的权限

(4)RabbitMQ 有类似的权限管理:虚拟消息服务器 Virtual Host

(5)每个 Virtual Host 相当于一个相对独立 RabbitMQ 服务器,每个 Virtual Host 之间是相互隔离,exchange、queue、message 不能互通,相当于 MySQL 的 db

(6)Virtual Name 一般以 / 开头

8、Connection:publisher/consumer 和 broker 之间的 TCP 连接

9、Channel

(1)如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大时建立 TCP Connection 的开销将是巨大的,效率也较低

(2)Channel 是在 Connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个 thread 创建单独的 Channel 进行通讯,AMQP method 包含 channel id 帮助客户端和 Message Broker 识别 Channel,所以 Channel 之间是完全隔离的

(3)Channel 作为轻量级的 Connection,极大减少了操作系统建立 TCP Connection 开销 

10、Exchange

(1)message 到达 Broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 Queue 中去

(2)常用的类型有:direct(point-to-point)、topic(publish-subscribe)、fanout(multicast)

11、Queue:消息最终被送到这里等待 consumer 取走

12、Binding

(1)Exchange 和 Queue 之间的虚拟连接

(2)Binding 中可以包含 routing key

(3)Binding 信息被保存到 Exchange 中的查询表中,用于 message 的分发依据

 

安装

1、RPM 包将需要 sudo 权限来安装和管理,在 sudo 不可用的环境中,请考虑使用通用二进制构建

2、Yum 会验证它所安装的任何软件包的签名,因此该过程的第一步是导入签名密钥

# RabbitMQ 签名密钥
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
# Erlang 仓库
rpm --import https://packagecloud.io/rabbitmq/erlang/gpgkey
# RabbitMQ 服务器资源库
rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey

3、使用 PackageCloud Yum 存储库安装 Erlang

(1)在安装 RabbitMQ 之前,必须安装一个支持的 Erlang / OTP 版本,标准 Red Hat、Fedora、CentOS 存储库提供的 Erlang 版本通常已经过期,不能用于运行最新的 RabbitMQ 版本

(2)RabbitMQ 团队制作一个精简包,只提供运行 RabbitMQ 所需的那些组件,该包剥离一些对运行 RabbitMQ 并非必要的 Erlang 模块和依赖(依赖)

curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/8/erlang-25.1.1-1.el8.x86_64.rpm/download.rpm?distro_version_id=205
sudo yum install erlang-25.1.1-1.el8.x86_64

4、使用 PackageCloud Yum 存储库安装 RabbitMQ

(1)使用 PackageCloud 提供的 Yum 软件库设置脚本,在将其输送到有权限的shell之前,一定要验证所下载的内容

curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash
wget --content-disposition https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/8/rabbitmq-server-3.11.0-1.el8.noarch.rpm/download.rpm?distro_version_id=205
sudo yum install rabbitmq-server-3.11.0-1.el8.noarch

5、Java 客户端

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.16.0</version>
</dependency>

 

常用命令

1、添加开机启动 RabbitMQ 服务

chkconfig rabbitmq-server on

2、启动服务

/sbin/service rabbitmq-server start

3、查看服务状态

/sbin/service rabbitmq-server status

4、停止服务

/sbin/service rabbitmq-server stop

5、开启 web 管理插件

rabbitmq-plugins enable rabbitmq_managemen

 

重置命令

1、关闭应用

rabbitmqctl stop_app

2、清除

rabbitmqctl reset

3、重新启动

rabbitmqctl start_app

 

管理插件

1、开启

rabbitmq-plugins enable rabbitmq_management

(1)插件激活后,不需要重新启动节点

(2)在自动部署期间,该插件可以通过启用的插件文件来启用

2、访问管理用户界面

(1)管理界面可以通过 Web 浏览器访问:http://{node-hostname}:15672/

(2)node-hostname:RabbitMq 节点所运行的在主机名

(3)用户界面、HTTP API,端口默认 15672;不支持 AMQP 0-9-1、AMQP 1.0、STOMP、MQTT 连接,这些客户端应该使用单独的端口

(4)用户必须被授予访问管理界面的权限

3、访问权限

(1)管理 UI 需要认证和授权,就像 RabbitMQ 对连接客户端的要求一样

(2)除了成功的认证之外,管理 UI 的访问由用户标签控制,这些标签使用 rabbitmqctl 进行管理,新创建的用户默认没有设置任何标签

标签 权限
(None) 无法访问管理插件
management

用户可以通过信息传递协议加做的任何事情

列出他们可以通过 AMQP 登录的虚拟主机

查看他们自己的虚拟主机中的所有队列、交换、绑定情况

查看、关闭他们自己的通道和连接

查看涵盖他们所有虚拟主机的“全局”统计数据,包括其他用户在其中的活动

policymaker

management 标签的所有权限

查看、创建、删除他们可以通过 AMQP 登录的虚拟主机的政策、参数

monitoring

management 标签的所有权限

列出所有的虚拟主机,包括他们无法使用信息传输协议访问的虚拟主机

查看其他用户的连接、通道

查看节点级的数据,如:内存使用、集群

查看所有虚拟主机的真正全局统计数据

administrator policymaker、monitoring 的所有权限

创建、删除虚拟主机

查看、创建、删除用户

查看、创建、删除权限

关闭其他用户的连接

(3)每个用户通常最多需要一个标签

(4)正常 RabbitMQ 对资源的权限,仍适用于 monitoring、administrator;仅仅因为一个用户是 monitoring / administrator,并不授予他们通过管理插件或其他方式,对交换、队列、绑定的完全访问权

(5)所有用户只能列出他们有任何权限的虚拟主机内的对象

4、创建一个用户

rabbitmqctl add_user username password

(1)用户名:要创建的用户的名字

(2)密码:创建的用户用于登录 RabbitMQ 的密码

5、授予用户所需的权限

rabbitmqctl set_permissions [-p vhost] user conf write read

(1)vhost:授予用户访问权的虚拟主机的名称,默认为 /

(2)user:授予指定虚拟主机访问权的用户名称

(3)conf:匹配资源名称的正则表达式,用户被授予配置权限

(4)write:一个匹配资源名称的正则表达式,用户被授予写权限

(5)read:匹配资源名称的正则表达式,用户被授予读取权限

6、授予用户管理界面访问权限

rabbitmqctl username [tag ……]

(1)username:要设置标签的用户的名字

(2)tag:0 个或多个要设置的标签,任何现有标签将被删除

 

用户角色

1、可以访问 http://ip:15672,默认用户名(guest)、密码(guest)

2、超级管理员

(1)administrator

(2)可登陆管理控制台,可查看所有的信息,并且可以对用户、策略进行操作

2、监控者

(1)monitoring

(2)可登陆管理控制台,同时可以查看 rabbitmq 节点的相关信息(进程数、内存使用情况、磁盘使用情况等)

3、策略制定者

(1)policymaker

(2)可登陆管理控制台,同时可以对 policy 进行管理,但无法查看节点的相关信息

4、普通管理者

(1)management

(2)仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理

5、其他

(1)无法登陆管理控制台

(2)通常为普通的生产者、消费者

 

RabbitMQ 提供 6 种工作模式

1、简单模式

2、Work Queues:工作队列 / 任务队列

3、Publish / Subscribe:发布 / 订阅模式

4、Routing:路由模式

5、Topics:主题模式

6、RPC:远程调用模式

 

简单模式

1、P:生产者,发送消息的程序

2、C:消费者,消息的接收者,一直等待消息

3、Queue:消息队列,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息

 

Work Queues(工作队列模式)

1、避免立即执行资源密集型任务,而不得不等待它完成

2、把任务封装为消息,并将其发送到队列,在后台运行的工作进程将弹出任务,并最终执行作业

3、当有多个工作线程时,这些工作线程将一起处理这些任务

 

com.rabbitmq.client.ConnectionFactory

public class ConnectionFactory extends Object implements Cloneable

1、工厂类,打开一个到 RabbitMQ 节点的连接

2、大多数连接和套接字设置都是使用该工厂配置的

3、一些适用于连接的设置也可以在这里配置,并将适用于由该工厂产生的所有连接

 

创建一个新的 Broker 连接

public Connection newConnection() throws IOException, TimeoutException

1、如果启用了自动连接恢复,该方法返回的连接将是可恢复的

2、重新连接的尝试将总是使用 ConnectionFactory 上配置的地址

3、返回一个 Connection

 

创建一个新的通道,使用一个内部分配的通道号

Channel createChannel() throws IOException

1、如果启用了自动连接恢复,这个方法返回的通道将是可恢复的

2、返回一个新的通道,如果没有,则为 null

 

创建一个新的通道,如果可能的话使用指定的通道号

Channel createChannel(int channelNumber) throws IOException

(1)channelNumber:要分配的通道号

(2)返回一个新的通道描述符,如果这个通道号已经被使用,则为 null

posted @   半条咸鱼  阅读(120)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示