3.消息中间件MQ

创建信息 发给 消息中间件服务器, 消息中间件客户端 就能读取信息消费

使用消息中间件后, 两个应用程序不需要直接通讯, 可实现应用之间解耦, 流量削峰, 数据分发

消息中间件有很多种,如 ActiveMQ (Java), RocketMQ(阿里开发的,双11用的)等等

特性 ActiveMQ RabbitMQ RocketMQ Kafka
单机吞吐量 万级 万级 10 万级 10 万级
开发语言 java erlang java scala
时效性 ms 级 us级,这是 RabbitMQ 的一大特点,延迟最低 ms 级  ms 级
可用性 高,基于主从架构 高,基于主从架构 非常高,分布式架构 非常高,分布式架构
消息可靠性 有较低的概率丢失数据 基本不丢 经过参数优化配置,可以做到 0 丢失 同 RocketMQ
功能支持 MQ 领域的功能极其完备 基于 erlang 开发,并发能力很强,性能极好,延时很低 MQ 功能较为完善,还是分布式的,扩展性好 功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用

 

目录 

ActiveMQ

队列模式 java案例:


ActiveMQ

下载,启动

服务端访问地址 http://127.0.0.1:8161 可以看到都有哪些消息被创建了,哪些被消费了

activeMQ 有两种模式,分别是队列模式和主题模式

http://127.0.0.1:8161/admin/queues.jsp

http://127.0.0.1:8161/admin/topics.jsp

队列模式:

就是分食模式。 比如生产方发了 10条消息到 activeMQ 服务器, 而此时有多个 消费方,那么这些消费方就会瓜分这些10条消息,一条消息只会被一个消费方得到。

主题模式:

就是订阅模式。 比如生产方发了10条消息,而此时有多个消费方,那么多个消费方都能得到这 10条消息,就如同订阅公众号那样。

注: 主题模式, 消费者要先启动。 如果在生产者生产完成之后再启动,是看不到消息的


java案例:

导入activemq 包

队列/主题 生产者:
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;
public class TestProducer {
    //服务地址,端口默认61616
    private static final String url="tcp://127.0.0.1:61616";
    //这次发送的消息名称
    private static final String topicName="queue_style";

    public static void main(String[] args) throws JMSException {
        //0. 先判断端口是否启动了Active MQ 服务器,8161是否打开
        ...
        //1.创建ConnectiongFactory,绑定地址
        ConnectionFactory factory=new ActiveMQConnectionFactory(url);
        //2.创建Connection
        Connection connection= factory.createConnection();
        //3.启动连接
        connection.start();
        //4.创建会话
        Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5.创建一个目标 (队列/主题类型)
        Destination destination=session.createQueue(topicName);//队列
        Destination destination=session.createTopic(topicName);//主题
        //6.创建一个生产者
        MessageProducer producer=session.createProducer(destination);
        for (int i = 0; i < 100; i++) {
        //7.创建消息
            TextMessage textMessage=session.createTextMessage("队列/主题消息-"+i);
        //8.发送消息
            producer.send(textMessage);
            System.out.println("发送:"+textMessage.getText());
        }
        //7. 关闭连接
        connection.close();
    }
}
队列/主题 消费者:
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;
public class TestConsumer {
    //服务地址,端口默认61616
    private static final String url="tcp://127.0.0.1:61616";
    //这次消费的消息名称
    private static final String topicName="queue_style";
 
    //消费者有可能是多个,为了区分不同的消费者,为其创建随机名称
    private static final String consumerName="consumer-" + RandomUtil.randomString(5);
    public static void main(String[] args) throws JMSException {
        //0. 先判断端口是否启动了Active MQ 服务器,8161是否打开
        ...
        System.out.printf("%s 消费者启动了。 %n", consumerName);
 
        //1.创建ConnectiongFactory,绑定地址
        ConnectionFactory factory=new ActiveMQConnectionFactory(url);
        //2.创建Connection
        Connection connection= factory.createConnection();
        //3.启动连接
        connection.start();
        //4.创建会话
        Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5.创建一个目标 (队列/主题类型)
        Destination destination=session.createQueue(topicName);//队列
        Destination destination=session.createTopic(topicName);//主题
        //6.创建一个消费者
        MessageConsumer consumer=session.createConsumer(destination);
        //7.创建一个监听器
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message arg0) {
                TextMessage textMessage=(TextMessage)arg0;
                try {
                    System.out.println(consumerName +" 接收消息:"+textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
        //8. 因为不知道什么时候有,所以没法主动关闭,就不关闭了,一直处于监听状态
        //connection.close();
    }
}

 

 

 

 

RocketMQ 

下载安装

bin   启动脚本

conf    配置文件

 

启动

默认内存特别大, runbroker.sh  runserver.sh 修改jvm内存

启动NameServer

启动Broker

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章