zoukankan      html  css  js  c++  java
  • net平台的rabbitmq

    net平台的rabbitmq使用封装

    前言

      RabbitMq大家再熟悉不过,这篇文章主要整对rabbitmq学习后封装RabbitMQ.Client的一个分享。文章最后,我会把封装组件和demo奉上。

    Rabbitmq的运作

      从下图可以看出,发布者(Publisher)是把消息先发送到交换器(Exchange),再从交换器发送到指定队列(Queue),而先前已经声明交换器与队列绑定关系,最后消费者(Customer)通过订阅或者主动取指定队列消息进行消费。

      那么刚刚提到的订阅和主动取可以理解成,推(被动),拉(主动)。

      推,只要队列增加一条消息,就会通知空闲的消费者进行消费。(我不找你,就等你找我,观察者模式)

      拉,不会通知消费者,而是由消费者主动轮循或者定时去取队列消息。(我需要才去找你)

      使用场景我举个例子,假如有两套系统 订单系统和发货系统,从订单系统发起发货消息指令,为了及时发货,发货系统需要订阅队列,只要有指令就处理。

      可是程序偶尔会出异常,例如网络或者DB超时了,把消息丢到失败队列,这个时候需要重发机制。但是我又不想while(IsPostSuccess == True),因为只要出异常了,会在某个时间段内都会有异常,这样的重试是没意义的。

      这个时候不需要及时的去处理消息,有个JOB定时或者每隔几分钟(失败次数*间隔分钟)去取失败队列消息,进行重发。

    Publish(发布)的封装

      步骤:初始化链接->声明交换器->声明队列->换机器与队列绑定->发布消息。注意的是,我将Model存到了ConcurrentDictionary里面,因为声明与绑定是非常耗时的,其次,往重复的队列发送消息是不需要重新初始化的。

     View Code

      下次是本机测试的发布速度截图:

      4.2W/S属于稳定速度,把反序列化(ToJson)会稍微快一些。

    Subscribe(订阅)的封装

      发布的时候是申明了交换器和队列并绑定,然而订阅的时候只需要声明队列就可。从下面代码能看到,捕获到异常的时候,会把消息送到自定义的“死信队列”里,由另外的JOB进行定时重发,因此,finally是应答成功的。

     View Code

      下次是本机测试的发布速度截图:

      快的时候有1.9K/S,慢的时候也有1.7K/S

    Pull(拉)的封装

      直接上代码:

     View Code

      快的时候有1.8K/s,稳定是1.5K/S

    Rpc(远程调用)的封装

      首先说明下,RabbitMq只是提供了这个RPC的功能,但是并不是真正的RPC,为什么这么说:

      1、传统Rpc隐藏了调用细节,像调用本地方法一样传参、抛出异常

      2、RabbitMq的Rpc是基于消息的,消费者消费后,通过新队列返回响应结果。

     View Code

       可以用,但不建议去用。可以考虑其他的RPC框架。grpc、thrift等。

     结尾

      本篇文章,没有过多的写RabbitMq的知识点,因为园子的学习笔记实在太多了。下面把我的代码奉上 https://github.com/SkyChenSky/RabbitMq 。如果有发现写得不对的地方麻烦在评论指出,我会及时修改以免误导别人。

      如果本篇文章您有用,请点击一下推荐,谢谢大家阅读。

     
    分类: 架构
  • 相关阅读:
    Docker
    Docker
    Linux
    VUE- 前端插件
    小程序中实现 input 搜索框功能
    Vue 中用delete方式进行axios请求接口,请求状态码报415(Unsupported Media Type)
    关于小程序使用map组件,标记markers时报错误(ret is not defined)
    关于element 框架中table表格选中并切换下一页之前选中数据消失的问题
    vue切换路由时报错 uncaught(in promise) Navigation Duplicated 问题
    2019-09-09 JS面试题(持续更新中)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/6498879.html
Copyright © 2011-2022 走看看