赞
踩
基于多线程队列简单实现mq:
public class MayiktThreadMQ { /** * Broker */ private static LinkedBlockingDeque<JSONObject> broker = new LinkedBlockingDeque<JSONObject>(); public static void main(String[] args) { // 创建生产者线程 Thread producer = new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(1000); JSONObject data = new JSONObject(); data.put("phone", "18611111111"); broker.offer(data); } catch (Exception e) { } } } }, "生产者"); producer.start(); Thread consumer = new Thread(new Runnable() { @Override public void run() { while (true) { try { JSONObject data = broker.poll(); if (data != null) { System.out.println(Thread.currentThread().getName() + ",获取到数据:" + data.toJSONString()); } } catch (Exception e) { } } } }, "消费者"); consumer.start(); } }
基于netty实现mq:
body:{"msg":{"userId":"123456","age":"23"},"type":"producer",”topic”:””}
持久化机制。
不会丢失,消息确认机制 必须要消费者消费该消息成功之后,在通知给mq服务器端 删除该消息。
服务器自动推送
。消费者主动拉取消息
。Mq消费者根据自身能力情况 ,拉取mq服务器端消息消费。
默认的情况下是取出一条消息。
缺点:存在延迟的问题
消费者实现集群。
消费者批量获取消息即可。
rabbitMQ的总体架构思想就是使用Netty的NIO模型通信。
生产者和消费者操作时首先要向消息中间件进行连接操作。
也就是说生产者和消费者相对于消息中间件都是Client,而消息中间件是Server。
RabbitMQ介绍:
RabbitMQ基础概念:
Channel(信道):
多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,复用TCP连接的通道。每个channel表示一个会话任务。
Producer(消息的生产者):
向消息队列发布消息的客户端应用程序。Consumer(消息的消费者):
从消息队列取得消息的客户端应用程序。Message(消息):
消息由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(消息优先权)、delivery-mode(是否持久性存储)等。Routing Key(路由键):
消息头的一个属性,用于标记消息的路由规则,决定了交换机的转发路径。最大长度255 字节。Queue(消息队列):
存储消息的一种数据结构,用来保存消息,直到消息发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将消息取走。需要注意,当多个消费者订阅同一个Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理,每一条消息只能被一个订阅者接收。Exchange(交换器|路由器):
提供Producer到Queue之间的匹配,接收生产者发送的消息并将这些消息按照路由规则转发到消息队列。交换器用于转发消息,它不会存储消息 ,如果没有 Queue绑定到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息。交换器有四种消息调度策略(下面会介绍),分别是fanout, direct, topic, headers。Binding(绑定):
用于建立Exchange和Queue之间的关联。一个绑定就是基于Binding Key将Exchange和Queue连接起来的路由规则,所以可以将交换器理解成一个由Binding构成的路由表。Broker:
RabbitMQ Server,服务器实体。RabbitMQ环境的基本安装:
RabbitMQ 它依赖于Erlang,需要先安装Erlang。不同JDK版本对应的Erlang和RabbitMQ Server的版本也会有所不同。
RabbitMQ常见名词:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。