免费网站站,wordpress+新打开空白,资讯网站怎么做,中国最新新闻头条文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1 简单模式3.2 工作模式3.3 发布订阅3.4 路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1 单机部署5.1.1 安装erlang5.1.2 安装rabbitmq 5.2 集群部署#xff08;镜… 文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1 简单模式3.2 工作模式3.3 发布订阅3.4 路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1 单机部署5.1.1 安装erlang5.1.2 安装rabbitmq 5.2 集群部署镜像模式5.2.1 配置节点5.2.2 创建集群 5.3 K8s部署5.3.1 创建yaml文件5.3.2 申请资源清单启动各个yaml文件5.3.3 访问Rabbirmq页面 六、常用命令 一、RabbitMQ简介
1.1、概述
RabbitMQ是实现了高级消息队列协议AMQP的开源消息代理软件亦称面向消息的中间件。RabbitMQ服务器是用Erlang语言编写的而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
1.2、特性
**可伸缩性**集群服务 **消息持久化**从内存持久化消息到硬盘再从硬盘加载到内存
解决什么问题
进程间的通讯。程序间解耦耦合。web高并发。来不及进行同步处理。”too many connections”(同步 异步切换)
二、RabbitMQ原理架构 中间的Broker表示RabbitMQ服务每个Broker里面至少有一个Virtual host虚拟主机每个虚拟主机中有自己的Exchange交换机、Queue队列以及Exchange交换机与Queue队列之间的绑定关系Binding。producer生产者和consumer消费者通过与Broker建立Connection来保持连接然后在Connection的基础上建立若干Channel信道用来发送与接收消息
名词解释
exchange它指定消息按什么规则路由到哪个列队 给消息分类queue消息载体每个消息都会被投递到一个或多个列队里面。bindingexchange和queue按照规则绑定connectionsproducer和consumer用TCPconnections链接到rabbitMQchannelsTCP中的虚拟链接。不损耗端口号Routing key 路由关键字消息路由Send Message 发送消息Receive Message 收消息Broker 缓存代理
三、RabbitMQ应用场景
3.1 简单模式
做最简单的事情一个生产者对应一个消费者RabbitMQ相当于一个消息代理负责将A的消息转发给B
应用场景将发送的电子邮件放到消息队列然后邮件服务在队列中获取邮件并发送给收件人、聊天等
3.2 工作模式
一条消息只会被一个消费者接收rabbit采用轮询的方式将消息是平均发送给消费者的消费者在处理完某条消息后才会收到下一条消息。
应用场景对于 任务过重或任务较多情况使用工作队列可以提高任务处理的速度。
3.3 发布订阅
每个消费者监听自己的队列。生产者将消息发给broker由交换机将消息转发到绑定此交换机的每个队列每个绑定交换机的队列都将接收到消息
应用场景用户通知当用户充值成功或转账完成系统通知用户通知方式有短信等多种方法 。比如邮件群发,群聊天,广告等。
3.4 路由模式
每个消费者监听自己的队列并且设置routingkey。生产者将消息发给交换机由交换机根据routingkey来转发消息到指定的队列。
应用场景如在商品库存中增加了1台iphone13iphone13促销活动消费者指定routing key为iphone13只有此促销活动会接收到消息其它促销活动不关心也不会消费此routing key的消息
3.5 主题订阅模式
根据主题Topics来接收消息将路由key和某模式进行匹配此时队列需要绑定在一个模式上#匹配一个词或多个词*只匹配一个词。
应用场景同上iphone促销活动可以接收主题为iphone的消息如iphone12、iphone13等
四、同类中间件对比
特性ActiveMQRabbitMQRockerMQKafkaproducer-comsumer生产消费支持支持支持pubkish-subscribe发布订阅支持支持支持支持request-reply请求应答支持支持API完整性高高高高多语言支持支持JAVA优先无关JAVA支持JAVA优先单机吞吐量万级万级万级十万级
消息延时毫秒微秒毫秒毫秒可用性高主从高主从高分布式高分布式消息丢失低低理论上不会丢失理论上不会丢失消息重复可控制理论上会有重复文档完整性高高高高提供快速入门有有有有社区活跃度高高中高商业支持无无阿里云无成熟度成熟成熟比较成熟成熟日志领域特点功能齐全被大量开源项目使用由于Erlang语言开发性能好各环节分布式设计多种消费模式可靠性、可扩展、持久性、性能高协议OPENWITE、STOP、REST、XMPP、AMQPAMQP自定义社区提供JMSPLAINTEXT、SSL、SASL_PLAINTEXT、SASL_SSL持久化内存、文件、数据库内存、文件磁盘文件磁盘、文件事务支持支持支持支持负载均衡支持支持支持支持管理界面一般好有web console实现好优点成熟的产品已经在很多项目得到应用。有较多文档各种协议支持较好多重语言的成熟客户端由于Erlang语言开发mq性能好管理页面丰富多种语言支持amqp客户端可用模型简单接口易用阿里大规模应用性能好支持多种消费开发都较活跃性能卓越、可用性非常高、日志领域比较成熟、功能简单、web界面友好缺点会莫名丢失消息目前社区对重心版本不是太活跃5.x维护较少不适合大规模队列由于Erlang语言开发难度较大不支持动态扩容产品文档匮乏没有在mq核心去实现JMS等接口对已有系统不能完美兼容消息失败不支持重试、消息顺序可能会导致消息乱序、社区更新较慢
五、RabbitMQ部署
5.1 单机部署
5.1.1 安装erlang
yum -y install make gcc gcc-c kernel-devel m4 ncurses-devel openssl-devel ncurses-devel
wget https://github.com/erlang/otp/releases/download/OTP-24.0/otp_src_24.0.tar.gz
tar -xzvf /otp_src_24.0.tar.gz
cd /otp_src_24.0
./configure --prefix/usr/local/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe
make make install5.1.2 安装rabbitmq
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.10.5/rabbitmq-server-3.10.5-1.el8.noarch.rpm
rpm -ivh --nodeps rabbitmq-server-3.10.5-1.el8.noarch.rpm
添加开机启动RabbitMQ服务
chkconfig rabbitmq-server on
启动RabbitMQ服务
rabbitmq-server start
后台启动RabbitMQ服务
rabbitmq-server -detached
停止RabbitMQ服务
rabbitmqctl stop
查看RabbitMQ服务状态
rabbitmqctl status
添加帐号:name 密码:
passwd rabbitmqctl add_user name passwd
赋予其administrator角色
rabbitmqctl set_user_tags name administrator
删除角色
rabbitmqctl delete_user Username
设置权限
rabbitmqctl set_permissions -p / name .* .* .*
查看用户的权限
rabbitmqctl list_user_permissions username 启动成功后,rabbitMQ的相关文件所在位置
相关命令 /usr/lib/rabbitmq/bin/相关的日志/var/log/rabbitmq/相关的配置 /etc/rabbitmq/设置的用户权限等元数据信息/var/lib/rabbitmq/mnesia/
http://ip:15672/ 尝试访问rabbitmq的web页面 可能会遇到报错情况Node的错误大概的意思就是说hosts中的地址和node中的地址不一样不匹配导致的。修改hosts文件中的本机的IP地址hosts中的本机的计算机名称和Node的节点的名称保持一致即可。
5.2 集群部署镜像模式
普通模式普通集群模式就是将 RabbitMQ 部署到多台服务器上每个服务器启动一个 RabbitMQ 实例多个实例之间进行消息通信。 此时我们创建的队列 Queue它的元数据主要就是 Queue 的一些配置信息会在所有的 RabbitMQ 实例中进行同步但是队列中的消息只会存在于一个 RabbitMQ 实例上而不会同步到其他队列。 当我们消费消息的时候如果连接到了另外一个实例那么那个实例会通过元数据定位到 Queue 所在的位置然后访问 Queue 所在的实例拉取数据过来发送给消费者。 这种集群可以提高 RabbitMQ 的消息吞吐能力但是无法保证高可用因为一旦一个 RabbitMQ 实例挂了消息就没法访问了如果消息队列做了持久化那么等 RabbitMQ 实例恢复后就可以继续访问了如果消息队列没做持久化那么消息就丢了。 镜像模式它和普通集群最大的区别在于 Queue 数据和原数据不再是单独存储在一台机器上而是同时存储在多台机器上。也就是说每个 RabbitMQ 实例都有一份镜像数据副本数据。每次写入消息的时候都会自动把数据同步到多台实例上去这样一旦其中一台机器发生故障其他机器还有一份副本数据可以继续提供服务也就实现了高可用。
5.2.1 配置节点
配置两台机器的hosts vim /etc/hosts修改后使用停止服务
rabbitmqctl stop设置erlang cookie
这里将第一台的该文件复制到 其他节点由于这个文件权限是400为方便传输先修改权限所以需要先修改该文件权限为 777。 集群各节点的cookie必须保持一致否则无法通信。 erlang是通过主机名来连接服务必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通rabbitmq服务启动会失败。 注意.erlang.cookie的目录也有可能在/var/lib/rabbitmq/.erlang.cookie 将权限和所属用户/组修改回来 node2
chmod 400 /root/.erlang.cookie启动个节点
rabbitmq-server –detached查看集群状态
[roottest-1]# rabbitmqctl cluster_status
Cluster status of node rabbitmq1 ...
Basics
Cluster name: rabbitmq1.example.local #集群名称
Disk Nodes #磁盘节点
rabbitmq1
Running Nodes #运作中节点
rabbitmq1
Versions #版本
rabbitmq1:
RabbitMQ 3.9.0 on Erlang 24.0.4 5.2.2 创建集群
rabbitmqctl stop_app #停止 app 服务
rabbitmqctl reset #清空元数据
rabbitmqctl join_cluster rabbitmq1 --ram #将rabbitmq-server2添加到集群当中并成为内存节点不加--ram默认是磁盘节点
rabbitmqctl start_app #启动 app 服务
rabbitmqctl stop_app #停止 app 服务
rabbitmqctl reset #清空元数据
rabbitmqctl join_cluster rabbitmq1 --ram #
将rabbitmq-server2添加到集群当中并成为内存节点不加--ram默认是磁盘节点
rabbitmqctl start_app #启动 app 服务
将集群设置为镜像模式只要在其中一台节点执行以下命令即可 rabbitmqctl set_policy ha-all # {ha-mode:all}
http://ip:15672/尝试访问rabbitmq的web页面5.3 K8s部署
5.3.1 创建yaml文件
包括comfigmap、secret、rbac、sts、svc五个yaml文件 Comfigmap
apiVersion: v1
kind: ConfigMap
metadata:name: rabbitmq-confignamespace: test
data:enabled_plugins: |[rabbitmq_management,rabbitmq_peer_discovery_k8s].
#启用插件rabbitmq_management和rabbitmq_peer_discovery_k8srabbitmq.conf: |cluster_formation.peer_discovery_backend rabbit_peer_discovery_k8scluster_formation.k8s.host kubernetes.default.svc.cluster.localcluster_formation.k8s.address_type hostname################################################## rabbit-mq is rabbitmq-clusters namespace##################################################cluster_formation.k8s.hostname_suffix .rabbitmq-headless.rabbit-mq.svc.cluster.localcluster_formation.node_cleanup.interval 30cluster_formation.node_cleanup.only_log_warning truecluster_partition_handling autohealqueue_master_locatormin-masterscluster_formation.randomized_startup_delay_range.max 2vm_memory_high_watermark.absolute 1GBdisk_free_limit.absolute 2GBloopback_users.guest falseSecret.yaml 用来存储rabbitmq的用户名、密码及erlang.cookie。 erlang创建步骤erlang是集群之间互访的秘钥 首先需要生成一个erlang.cookie的文件 echo $(openssl rand -base64 32) erlang.cookie 然后再生成base64的值 如echo -n ‘v/sWCz4uKETUvneRyJVn87Jg15si2eGaWg54Yvefhrk’ |base64 apiVersion: v1
kind: Secret
metadata:name: devsecretnamespace: test
type: Opaque
data:rabbitDefaulUser: YWRtaW4 # echo -n admin |base64rabbitDefaultPass: YWRtaW4erlang.cookie: di96VHZ4VmhOY1Uxc3dzTG4zOHdyMmk2S1IrTG82L2xqUEdTTFUwYmdwVDRBPQRbac.yaml:
apiVersion: v1
kind: ServiceAccount #集群访问apiserver的凭证
metadata:name: rabbitmqnamespace: test
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: endpoint-readernamespace: test
rules:
- apiGroups: []resources: [endpoints]verbs: [get]
---
kind: RoleBinding #将角色绑定
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: endpoint-readernamespace: test
subjects:
- kind: ServiceAccountname: rabbitmq
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: endpoint-readerStatefulset.yaml: 要提前创建好挂载目录
apiVersion: apps/v1
kind: StatefulSet
metadata:name: rabbitmqnamespace: test
spec:serviceName: rabbitmq-headlessselector:matchLabels:app: rabbitmq #在apps/v1中需与 .spec.template.metadata.label 相同用于hostname传播访问podreplicas: 3 #副本数3template:metadata:labels:app: rabbitmqspec:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- rabbitmqtopologyKey: kubernetes.io/hostnameserviceAccountName: rabbitmqterminationGracePeriodSeconds: 10containers:- name: rabbitmqimage: rabbitmq:latestimagePullPolicy: Neverresources:limits:cpu: 1memory: 500Mirequests:cpu: 1memory: 500MivolumeMounts:- name: config-volumemountPath: /etc/rabbitmq- name: rabbitmq-datamountPath: /var/lib/rabbitmq/mnesiaports:- name: httpprotocol: TCPcontainerPort: 15672- name: amqpprotocol: TCPcontainerPort: 5672livenessProbe:exec:command: [rabbitmq-diagnostics, status]initialDelaySeconds: 60periodSeconds: 60timeoutSeconds: 5readinessProbe:exec:command: [rabbitmq-diagnostics, status]initialDelaySeconds: 20periodSeconds: 60timeoutSeconds: 5env:- name: RABBITMQ_DEFAULT_USERvalueFrom:secretKeyRef:key: rabbitDefaulUsername: devsecret #登陆用户名和密码都存储在一个secret对象中- name: RABBITMQ_DEFAULT_PASSvalueFrom:secretKeyRef:key: rabbitDefaultPassname: devsecret- name: RABBITMQ_ERLANG_COOKIEvalueFrom:secretKeyRef:name: devsecretkey: erlang.cookie- name: HOSTNAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: MY_POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: RABBITMQ_USE_LONGNAMEvalue: true- name: K8S_SERVICE_NAMEvalue: rabbitmq-headless- name: RABBITMQ_NODENAMEvalue: rabbit$(HOSTNAME).$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.cluster.local- name: K8S_HOSTNAME_SUFFIXvalue: .$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.cluster.localvolumes:- name: config-volumeconfigMap:name: rabbitmq-configitems:- key: rabbitmq.confpath: rabbitmq.conf- key: enabled_pluginspath: enabled_plugins- name: rabbitmq-datahostPath:path: /root/rabbitmq/datatype: DirectoryService.yaml
kind: Service
apiVersion: v1
metadata:name: rabbitmq-headlessnamespace: test
spec:clusterIP: NonepublishNotReadyAddresses: trueports:- name: amqpport: 5672- name: httpport: 15672selector:app: rabbitmq---
kind: Service
apiVersion: v1
metadata:namespace: testname: rabbitmq-service
spec:ports:- name: httpprotocol: TCPport: 15672nodePort: 30672 #管理web界面- name: amqpprotocol: TCPport: 5672targetPort: 5672nodePort: 30671selector:app: rabbitmqtype: NodePort5.3.2 申请资源清单启动各个yaml文件
kubectl apply -f rabbitmq-configmap.yaml
kubectl apply -f rabbitmq-secret.yaml
kubectl apply -f rabbitmq-rbac.yaml
kubectl apply -f rabbitmq-sts.yaml
kubectl apply -f rabbitmq-svc.yaml5.3.3 访问Rabbirmq页面
http://ip:30672/尝试访问rabbitmq的web页面需要手动创建用户并授权
六、常用命令
用户管理 A. 查看用户列表rabbitmqctl list_users B. 添加用户rabbitmqctl add_user C. 修改密码rabbitmqctl change_password D. 删除用户rabbitmqctl delete_user E. 设置用户角色 rabbitmqctl set_user_tags tag1,tag2角色有 management用户可以访问management管理插件 administrator所有权限 monitoring用户可以访问management管理插件查看所有连接、通道以及与节点相关的信息 policymaker用户可以访问management管理插件并管理他们有权访问的vhost的策略和参数节点与应用管理 A. 启动rabbitmq应用程序rabbitmqctl start_app B. 关闭rabbitmq应用程序但Erlang VM保持运行rabbitmqctl stop_app C. 关闭所有应用和节点rabbitmqctl stop D. 将Rabbitmq节点返回到原始状态包括删除数据rabbitmqctl reset集群节点 A. 查看集群状态rabbitmqctl cluster_status B. 添加节点rabbitmqctl join_cluster {–ram|–disk} rabbitnode C. 移除节点rabbitmqctl forget_cluster_node rabbitnode注意先关闭应用程序rabbitmqctl stop_app D. 节点健康检查rabbitmqctl node_health_check插件管理 A. 显示所有插件rabbitmq-plugins list B. 启用指定的插件rabbitmq-plugins enable rabbitmq_management rabbitmq_mqtt rabbitmq_prometheus查看有效配置 A. rabbitmqctl environment 文章转载自: http://www.morning.bqmhm.cn.gov.cn.bqmhm.cn http://www.morning.hjjkz.cn.gov.cn.hjjkz.cn http://www.morning.dmwjl.cn.gov.cn.dmwjl.cn http://www.morning.zylrk.cn.gov.cn.zylrk.cn http://www.morning.rltsx.cn.gov.cn.rltsx.cn http://www.morning.wpkr.cn.gov.cn.wpkr.cn http://www.morning.pqnpd.cn.gov.cn.pqnpd.cn http://www.morning.tkzqw.cn.gov.cn.tkzqw.cn http://www.morning.smmby.cn.gov.cn.smmby.cn http://www.morning.fwllb.cn.gov.cn.fwllb.cn http://www.morning.gsdbg.cn.gov.cn.gsdbg.cn http://www.morning.sbrjj.cn.gov.cn.sbrjj.cn http://www.morning.srwny.cn.gov.cn.srwny.cn http://www.morning.ddrdt.cn.gov.cn.ddrdt.cn http://www.morning.sryhp.cn.gov.cn.sryhp.cn http://www.morning.ymwrs.cn.gov.cn.ymwrs.cn http://www.morning.vuref.cn.gov.cn.vuref.cn http://www.morning.chbcj.cn.gov.cn.chbcj.cn http://www.morning.mrlkr.cn.gov.cn.mrlkr.cn http://www.morning.kpcjl.cn.gov.cn.kpcjl.cn http://www.morning.nsrlb.cn.gov.cn.nsrlb.cn http://www.morning.sfrw.cn.gov.cn.sfrw.cn http://www.morning.wknjy.cn.gov.cn.wknjy.cn http://www.morning.rldph.cn.gov.cn.rldph.cn http://www.morning.cdrzw.cn.gov.cn.cdrzw.cn http://www.morning.kpzbf.cn.gov.cn.kpzbf.cn http://www.morning.mmzfl.cn.gov.cn.mmzfl.cn http://www.morning.zbtfz.cn.gov.cn.zbtfz.cn http://www.morning.ktmbp.cn.gov.cn.ktmbp.cn http://www.morning.kztts.cn.gov.cn.kztts.cn http://www.morning.ygflz.cn.gov.cn.ygflz.cn http://www.morning.lgsqy.cn.gov.cn.lgsqy.cn http://www.morning.gtmdq.cn.gov.cn.gtmdq.cn http://www.morning.qkqjz.cn.gov.cn.qkqjz.cn http://www.morning.qnzpg.cn.gov.cn.qnzpg.cn http://www.morning.gnlyq.cn.gov.cn.gnlyq.cn http://www.morning.yaqi6.com.gov.cn.yaqi6.com http://www.morning.ppllj.cn.gov.cn.ppllj.cn http://www.morning.yrdt.cn.gov.cn.yrdt.cn http://www.morning.wcyr.cn.gov.cn.wcyr.cn http://www.morning.gnjkn.cn.gov.cn.gnjkn.cn http://www.morning.rsnd.cn.gov.cn.rsnd.cn http://www.morning.lxmks.cn.gov.cn.lxmks.cn http://www.morning.bfwk.cn.gov.cn.bfwk.cn http://www.morning.ckhry.cn.gov.cn.ckhry.cn http://www.morning.xzqzd.cn.gov.cn.xzqzd.cn http://www.morning.wpmlp.cn.gov.cn.wpmlp.cn http://www.morning.wljzr.cn.gov.cn.wljzr.cn http://www.morning.wjhqd.cn.gov.cn.wjhqd.cn http://www.morning.gyylt.cn.gov.cn.gyylt.cn http://www.morning.cjwkf.cn.gov.cn.cjwkf.cn http://www.morning.lmmyl.cn.gov.cn.lmmyl.cn http://www.morning.drmbh.cn.gov.cn.drmbh.cn http://www.morning.rnjgh.cn.gov.cn.rnjgh.cn http://www.morning.ykqbs.cn.gov.cn.ykqbs.cn http://www.morning.plqhb.cn.gov.cn.plqhb.cn http://www.morning.fcxt.cn.gov.cn.fcxt.cn http://www.morning.yrkdq.cn.gov.cn.yrkdq.cn http://www.morning.gwhjy.cn.gov.cn.gwhjy.cn http://www.morning.rltw.cn.gov.cn.rltw.cn http://www.morning.wynnb.cn.gov.cn.wynnb.cn http://www.morning.lyhry.cn.gov.cn.lyhry.cn http://www.morning.ldcsw.cn.gov.cn.ldcsw.cn http://www.morning.fphbz.cn.gov.cn.fphbz.cn http://www.morning.txtzr.cn.gov.cn.txtzr.cn http://www.morning.fy974.cn.gov.cn.fy974.cn http://www.morning.rlwgn.cn.gov.cn.rlwgn.cn http://www.morning.kgqpx.cn.gov.cn.kgqpx.cn http://www.morning.gltmz.cn.gov.cn.gltmz.cn http://www.morning.nrftd.cn.gov.cn.nrftd.cn http://www.morning.wtnwf.cn.gov.cn.wtnwf.cn http://www.morning.krfpj.cn.gov.cn.krfpj.cn http://www.morning.fy974.cn.gov.cn.fy974.cn http://www.morning.rklgm.cn.gov.cn.rklgm.cn http://www.morning.lkhfm.cn.gov.cn.lkhfm.cn http://www.morning.hbjqn.cn.gov.cn.hbjqn.cn http://www.morning.zxhhy.cn.gov.cn.zxhhy.cn http://www.morning.byjwl.cn.gov.cn.byjwl.cn http://www.morning.thwcg.cn.gov.cn.thwcg.cn http://www.morning.pxjp.cn.gov.cn.pxjp.cn