44.第36章 消息队列与微服务
Posted 网络之鹰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了44.第36章 消息队列与微服务相关的知识,希望对你有一定的参考价值。
一.RabbitMQ
1.1 RabbitMQ简介
RabbitMQ 采用Erlang 语言开发,Erlang 语言由Ericson 设计,Erlang 在分布式编程和故障恢复方面表现出色,电信领域被广泛使用。
https://www.erlang.org/
Broker: 接收和分发消息的应用,RabbitMQ Server 就是Message Broker。
Virtual host: 出于多租户和安全因素设计的,把AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的namespace 概念,当多个不同的用户使用同一个RabbitMQ server 提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue 等。
Connection: publisher/consumer 和broker 之间的TCP 连接。
Channel: 如果每一次访问RabbitMQ 都建立一个Connection,在消息量大的时候建立TCP Connection 的开销将是巨大的,效率也较低。Channel 是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread 创建单独的channel 进行通讯,AMQP method 包含了channel id 帮助客户端和message broker识别channel,所以channel 之间是完全隔离的。Channel 作为轻量级的Connection极大减少了操作系统建立TCP connection 的开销。
Exchange: message 到达broker 的第一站,根据分发规则,匹配查询表中的routing key, 分发消息到queue 中去。常用的类型有: direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。
Queue: 消息最终被送到这里等待consumer 取走。
Binding: exchange 和queue 之间的虚拟连接,binding 中可以包含routing key。Binding 信息被保存到exchange 中的查询表中,用于message 的分发依据。
rabbitmq 优势:
基于erlang 语言开发,具有高并发优点、支持分布式
具有消息确认机制、消息持久化机制,消息可靠性和集群可靠性高
简单易用、运行稳定、跨平台、多语言
开源
Queue 的特性:
消息基于先进先出的原则进行顺序消费
消息可以持久化到磁盘节点服务器
消息可以缓存到内存节点服务器提高性能
1.2 RabbitMQ 中的生产者消费者示例
生产者发送消息到broker server(RabbitMQ),在Broker 内部,用户创建Exchange/Queue,通过Binding 规则将两者联系在一起,Exchange 分发消息,根据类型/binding 的不同分发策略有区别,消息最后来到Queue 中,等待消费者取走。
JMS 是在2001 年发布的Java 消息服务(Java Message Service)应用程序接口,是一个Java 平台中关于面向消息中间件(MOM,message oriented middleware)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
以上是关于44.第36章 消息队列与微服务的主要内容,如果未能解决你的问题,请参考以下文章
如何防止重复消息在 WebJob 处理时不插入到服务总线队列中?