• 浮躁的我和小兔子不得不说的故事


    已经使用了大约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年还不知道如何使用。真的是太浮躁了。

    记录备查。

  • 相关阅读:
    Mac zsh: command not found zsh 所有命令在终端失效
    Java根据FreeMarker模板生成Word(doc)文档(带图片)
    2021年Java面试总结——自我篇
    toArray转换踩坑 java.lang.ClassCastException
    并发和并行
    protoBuf3学习
    StringBuffer和StringBuilder区别
    深拷贝和浅拷贝
    从不订购的客户
    使用jenkins遇到的问题汇总
  • 原文地址:https://www.cnblogs.com/forhell/p/13701139.html
Copyright © 2020-2023  润新知