zoukankan      html  css  js  c++  java
  • 浮躁的我和小兔子不得不说的故事

    已经使用了大约1-2年的小兔子.rabbitmq。但是我一直都很浮躁,并没有仔细的去阅读使用文档。用的是EasyNetQ,而且用的是最简单的send/Receive模式。

    前面想用publish/Subscribe,但是不会用。打开小兔子的管理页面,看不懂。因为不知道数据是怎么来的,又是怎么被消费的。

    听说MassTransit很强大。然后就试着用了一下。看了文档, 不懂。写了例子,神奇的事情发生了。Publish的数据。在各个客户端都收到呢?于是我就觉得还是用EasyNetQ。

    有一个新的需求来了。缓存同步。缓存更新了。需要通知各个前端api要更新缓存了。总不能用send/Receive模式。publish是个什么意思?最后我决定还是读下文档吧。

    看到了别人的写的文档。https://dotnet.ctolib.com/SFLAQiu-RabbitMQDemo.html

    又看了小兔子的后台。Exchange 交换机。和队列 之间是什么关系我才明白了。

    像EasyNetQ 的send/Receive模式。使用的是默认的交换机,类型是direct,直接发送到绑定的队列。

    像publish的模式。使用的是fanout类型的默认的交换机。

    可以在后台管理的exchange点开看得到bind的队列。

    基本的消息通讯步骤就是首先定义ExChange,然后定义队列,然后绑定交换机和队列。
    需要明确的一点儿是,发布者在发送消息是,并不是把消息直接发送到队列中,而是发送到Exchang,然后由交互机根据定义的消息匹 配规则,在将消息发送到队列中。
    Exchange有四种消息消息分发规则:direct,topic,fanout,header。

    来自:https://www.cnblogs.com/dandan123/p/10097711.html

    1>有一个生产者send消息。4个消费者receive干活。应该使用同一个id.(同一个队列)=>(轮流的发送消息到各个消费者)

    2>有一个生产者publish消息。不同消费者都要知道。需要绑定到同一个交换机上面。而且id不同。(不同队列)

    使用EasyNetQ 来实现的话。可以参考 https://www.cnblogs.com/dandan123/p/10097711.html 封装的很好。

    我的例子在http://127.0.0.1:15672/ 上面的结果。

    关键代码。

    服务端

    using (var bus = RabbitHutch.CreateBus("host=127.0.0.1:5672;virtualHost=/;publisherConfirms=true;timeout=10"))
    {
    var exchange = bus.Advanced.ExchangeDeclare("exchnage2020", ExchangeType.Fanout);
    //bus.Advanced
    //模拟生成者
    Random rd = new Random();
    while (true)
    {

    #region 核心代码,其他可以不要
    string message = $"你好,{System.Guid.NewGuid().ToString()}。";
    bus.Advanced.Publish(exchange, "", false, new Message<string>(message));
    //bus.Publish(message, "hello111");2222
    #endregion
    Console.WriteLine("发送信息:{0}", message);

    //随机休眠
    Thread.Sleep(TimeSpan.FromSeconds(rd.Next(10)));
    }
    }

    消费端

    using (var bus = RabbitHutch.CreateBus("host=127.0.0.1:5672;virtualHost=/;publisherConfirms=true;timeout=10"))
    {
    var exchange = bus.Advanced.ExchangeDeclare("exchnage2020", ExchangeType.Fanout);

    var qu = bus.Advanced.QueueDeclare("A");
    var qu2 = bus.Advanced.QueueDeclare("B");
    bus.Advanced.Bind(exchange, qu,"");
    bus.Advanced.Bind(exchange, qu2, "");

    bus.Advanced.Consume<string>(qu, (message, info) =>
    {
    Console.WriteLine("A接收信息:{0}", message.Body);
    });

    bus.Advanced.Consume<string>(qu2, (message, info) =>
    {
    Console.WriteLine("B接收信息:{0}", message.Body);
    });

    //bus.Subscribe<string>("hello", (message) =>
    // {
    // Console.WriteLine("接收信息:{0}", message);
    // });

    // bus.Subscribe<string>("hello1", (message) =>
    // {
    // Console.WriteLine("接收信息hello1:{0}", message);
    // });
    while (Console.ReadLine() != "fuck")
    {

    }
    }

    我很遗憾,一个如此简单的小兔子,我花了1-2年还不知道如何使用。真的是太浮躁了。

    记录备查。

  • 相关阅读:
    Mysql流程控制语句和存储过程
    第七章 MySQL基础
    第六章 操作数据
    第四章 数据库操作
    第三章 使用MySQL图形化工具
    第二章 初识MySQL
    第一章 数据库基础
    Live555源码学习02 ---- 框架
    Live555源码学习01 ---- 编译
    SRS4.0之RTMP转WebRTC02 ---- RTMP推流到SRS
  • 原文地址:https://www.cnblogs.com/forhell/p/13701139.html
Copyright © 2011-2022 走看看