RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。AMQP:Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言灯条件的限制。 |
AMQP具有如下的特性
可靠性(Reliablity):使用了一些机制来保证可靠性,比如持久化、传输确认、发布确认。
灵活的路由(Flexible Routing):在消息进入队列之前,通过Exchange来路由消息。对于典型的路由功能,Rabbit已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起,也通过插件机制实现自己的Exchange。
消息集群(Clustering):多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
高可用(Highly Avaliable Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
多种协议(Multi-protocol):支持多种消息队列协议,如STOMP、MQTT等。
多种语言客户端(Many Clients):几乎支持所有常用语言,比如Java、.NET、Ruby等。
管理界面(Management UI):提供了易用的用户界面,使得用户可以监控和管理消息Broker的许多方面。
跟踪机制(Tracing):如果消息异常,RabbitMQ提供了消息的跟踪机制,使用者可以找出发生了什么。
插件机制(Plugin System):提供了许多插件,来从多方面进行扩展,也可以编辑自己的插件。
RabbitMQ中的消息都只能存储在Queue中,生产者(下图中的P)生产消息并最终投递到Queue中,消费者(下图中的C)可以从Queue中获取消息并消费。
RabbitMQ部署
下面是RabbitMQ部署的定义代码,此代码由两部分组成,即RabbitMQ部署的部署以及其代理服务。镜像使用的是bitnami/rabbitmq:latest。通过NodePort模式对外暴露了15672和5672端口,并通过nfs文件系统对RabbitMQ的数据进行持久化。
#-------------定义RabbitMQ部署----------------- apiVersion: apps/v1beta2 kind: Deployment metadata: name: rabbit spec: replicas: 1 selector: matchLabels: app: rabbit strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: rabbit spec: containers: - image: bitnami/rabbitmq:latest imagePullPolicy: IfNotPresent name: rabbit ports: - containerPort: 15672 name: rabbit15672 protocol: TCP - containerPort: 5672 name: rabbit5672 protocol: TCP resources: {} volumeMounts: - mountPath: /bitnami name: rabbit-persistent-storage dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 volumes: - name: rabbit-persistent-storage nfs: path: /home/nfs-share/rabbit server: 10.0.33.201 #-----------------定义rabbit的代理服务-------------- apiVersion: v1 kind: Service metadata: name: rabbit-service spec: ports: - name: rabbit15672 nodePort: 31199 port: 15672 protocol: TCP targetPort: 15672 - name: rabbit15672 nodePort: 305672 port: 5672 protocol: TCP targetPort: 5672 selector: app: rabbit type: NodePort
通过kubectl,执行下面的命令在Kubernetes集群中部署Oracle数据库。
$ kubectl create -f rabbitmq.yaml --namespace=kube-public
在部署完成后,通过下面的命令可以查看RabbitMQ暴露的端口:
$ kubectl get svc --namespace=kube-public
部署验证
在浏览器中输入:http://10.0.33.203:31199/,访问部署好的RabbitMQ。在登录页面输入用户名和密码(此处初始user/bitnami),系统将会进入RabbitMQ的主页。
运行环境配置
在部署时,可以通过设置下面的环境变量来改变容器的运行时:
RABBITMQ_USERNAME: 用户名,默认值为user
RABBITMQ_PASSWORD: 密码,默认值为bitnami
RABBITMQ_HASHED_PASSWORD: 哈希密码
RABBITMQ_VHOST: 安装后启动创建的虚拟主机,默认值为 /
RABBITMQ_ERL_COOKIE: Erlang cookie用于确定不同的节点之间是否允许行互相通信。
RABBITMQ_NODE_TYPE: 节点类型,有限制: stats, queue-ram or queue-disc。 默认值为stats
RABBITMQ_NODE_NAME: 节点名称和主机,例如: node@hostname或node 。默认值为rabbit@localhost。
RABBITMQ_NODE_PORT_NUMBER: 节点端口,默认值为5672
RABBITMQ_CLUSTER_NODE_NAME: 集群名称,例如:clusternode@hostname
RABBITMQ_CLUSTER_PARTITION_HANDLING: 集群分区恢复机制,默认值为: ignore
RABBITMQ_MANAGER_PORT_NUMBER: 管理端口,默认值为15672
RABBITMQ_DISK_FREE_LIMIT: Rabbitmq存储数据的可用空间限制,当低于该值的时候,将触发流量限制。默认值为 {mem_relative, 1.0}
RABBITMQ_ULIMIT_NOFILES: 资源限制, 打开文件描述符的最大数目,默认值为65536