NetCore基于EasyNetQ的高级API使用RabbitMq

一、消息队列

 消息队列作为分布式系统中的重要组件,常用的有MSMQ,RabbitMq,Kafa,ActiveMQ,RocketMQ。至于各种消息队列的优缺点比较,在这里就不做扩展了,网上资源很多。

 更多内容可参考 消息队列及常见消息队列介绍。我在这里选用的是RabbitMq。

官网地址:http://www.rabbitmq.com

安装和配置:Windows下RabbitMq安装及配置

二、RabbitMq简单介绍 

 RabbitMQ是一款基于AMQP(高级消息队列协议),由Erlang开发的开源消息队列组件。是一款优秀的消息队列组件,他由两部分组成:服务端和客户端,客户端支持多种语言的驱动,如:.Net、JAVA、   Erlang等。在RabbitMq中首先要弄清楚的概念是 交换机、队列、绑定。基本的消息通讯步骤就是首先定义ExChange,然后定义队列,然后绑定交换机和队列。

 需要明确的一点儿是,发布者在发送消息是,并不是把消息直接发送到队列中,而是发送到Exchang,然后由交互机根据定义的消息匹配规则,在将消息发送到队列中。

 Exchange有四种消息消息分发规则:direct,topic,fanout,header。headers 匹配 AMQP 消息的 header 而不是路由键,此外 headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了。

 详细的概念介绍推荐查看:消息队列之RabbitMq

三、EasyNetQ使用

 Easynetq是一个简单易用的Rabbitmq Net客户端。同时支持 NetFramework和NetCore。GitHub地址。它是针对RabbitMq Net客户端的进一步封装。关于EasyNetQ的简单使用推荐教程:EasyNetQ的介绍。

 本文主要介绍基于EasyNeq的高级API的使用。EasyNetQ的作者在核心的IBus接口中尽量避免暴露AMQP中的交换机、队列、绑定这些概念,使用者即使不去了解这些概念,也能完成消息的发送接收。这相当简洁,但某些情况下,基于应用场景的需要,我们需要自定义交换机、队列、绑定这些信息,EasyNetQ允许你这么做,这些都是通过IAdvanceBus接口实现。

3.1 项目装备

 这里为了演示,首先新建一个项目,包括一个发布者,两个接收者,一个公共的类库

640?wx_fmt=png

安装EasyNetQ: NuGet>Install-Package EasyNetQ

3.2 简单封装

在Common项目里面是针对Easynetq的使用封装,主要目录如下

640?wx_fmt=png

 

 在RabbitMq文件夹下,是针对消息发送接收的简单封装。

 首先来看下RabbitMqManage,主要的发送和订阅操作都在这个类中。其中ISend接口定义了发送消息的规范,SendMessageManage是ISend的实现。IMessageConsume接口定义订阅规范。

 MesArg 和PushMsg分别是订阅和发送需用到的参数类。RabbitMQManage是暴露在外的操作类。

 首先看发送的代码

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

在EasyNetQ中对于异步发送消息的时候,消息是否送达Broker只需要查看异步发送方法最终执行成功还是失败,成功就表示消息送达,如果失败可以将失败后的消息存入数据库中,然后用后台线程轮询

数据库表,将失败后的消息进行重新 发送。这种方式还可以进一步变成消息表,就是先将要发送的消息存入消息表中,然后后台线程轮询消息表来进行消息发送。一般这种方式被广泛用于分布式事务中,

将本地数据库操作和消息表写入放入同一个本地事务中,来保证消息发送和本地数据操作的同步成功,因为我的系统中,分布式事务的涉及很少,所以就没这样去做,只是简单的在异步发送的时候监控下

是否发送失败,然后针对失败的消息做一个重新发送的机制。这里,推荐大佬的NetCore分布式事务解决方案 CAP GitHub地址。

 接着看一下消息订阅接收涉及的代码

640?wx_fmt=png

在订阅中我定义了一个接口,最终业务代码中,所有的消息订阅类,都需要继续此接口

最后,我们来看下对外使用的操作类

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

这里面主要封装了消息的发送和订阅,以及IBus单例的创建。在后续的消息发送和订阅主要就通过此处来实现。我们看到一开始的类目结构中还有一个RaExMessageHandleJob类,这个类就是一个后台

循环任务,用来监测数据库中是否保存了发送失败的消息,如果有,则将消息取出,尝试重新发送。在此就不做多的介绍,大家可以根据自己的实际需求来实现。

3.3 发布者

 现在来看一下消息发布者的代码

 640?wx_fmt=png

 主要的发送代码都在Send类中,其中appsettings.json里面配置了Rabbitmq的连接地址,TestDto只是一个为了方便演示的参数类。

 下面看一下Program里面的代码

640?wx_fmt=png

 很简单的一个发送消息调用。

 然后来看一下Send类中的代码

640?wx_fmt=png

640?wx_fmt=png

3.4 消费者

 首先来看下消费者端的目录结构

640?wx_fmt=png

 

其中appsettings.json中配置Rabbitmq的连接信息,Program中只是简单调用消息订阅

640?wx_fmt=png

主要的消息订阅代码都在MessageManage文件夹下,MessageManService用于定义消息订阅类型

640?wx_fmt=png

640?wx_fmt=png

Consume文件夹下主要定义了消息的业务处理

640?wx_fmt=png

可以看到,所有的类都集成自我们定义的接口IMessageConsume。

四、总结

在EasyNetQ中如果需要消费者确认功能,则需要在Rabbitmq的连接配置中设置publisherConfirms=true,这将会开启自动确认。在使用高级api定义交换机和队列时可以自己定义多种参数,比如消息是否持久化,消息最大长度等等,具体大家可以去看官方文档,上面有详细介绍。Easynetq会自动去捕获消费异常的消息并将其放入到错误队列中,而且官方提供了重新发送错误队列中消息的方法,当然你也可以自己去监视错误列队,对异常消息进行处理。EasyNetQ里面作者针对消息的发布确认和消费确认都做了封装。在EasyNetQ中发布消息的时候如果选用的同步发送,只要没有抛出异常,我们就可以认为任务消息已经正确到达Broker,而异步发送的话需要我们自己去监视Task是否成功 。如果开启了自动确认,并不需要我们在消息处理的方法体中手动返回ack信息,只要消息被 正确处理就会自动ack。虽然RabbitMq中也有事务消息,但由于性能比较差,并不推荐使用。其实,只要我们能明确消息是否发布成功和消费成功,就将会很容易在这个基础上扩展出分布式事务的处理。

原文地址:https://www.cnblogs.com/dandan123/p/10097711.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bzoj#4722-由乃【倍增,抽屉原理,bitset】

正题 题目链接:https://darkbzoj.tk/problem/4722 题目大意 给出一个长度为nnn的序列值域为[0,v)[0,v)[0,v),要求支持操作 询问一个区间能否找到两个没有交的非空下标集合使得这些位置的和加上集合的大小相等。区间立方然后取模vvv。 1≤n≤105,1≤v≤10001\leq …

二分图匹配(二)

文章目录例题:NC20483 [ZJOI2009]假期的宿舍题目描述:题解:NC51316 Going Home题目描述:题解:NC107638 poj3041 Asteroids题目描述:题解:NC20472 [ZJOI2007]矩阵游戏题目描述:题解&a…

质数和分解(动态规划)

文章目录题目描述解析记忆化搜索代码无限背包代码thanks for reading!题目描述 解析 很好的题 记忆化搜索 我一开始的思路就是记忆化搜索 为了不重复,搜索的时候规定拆出来一个数A后一会不能再拆比A更小的了 这样就不难写了 (忽略我n^2的素…

Graph Theory Class(Min25求1~n质数和)

Graph Theory Class 原理不会板子抄的。 // n^0.75/log 求1~n的质数和 #include <bits/stdc.h> #define ll long long using namespace std; const int N 10000010;ll n,mod; int prime[N],id1[N],id2[N],vis[N],cnt,m; ll g[N],s[N],a[N],T; int ID(ll x){return x<…

【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权

上篇文章介绍了如何使用Dapper持久化IdentityServer4&#xff08;以下简称ids4&#xff09;的信息&#xff0c;并实现了sqlserver和mysql两种方式存储&#xff0c;本篇将介绍如何使用ids4进行客户端授权。.netcore项目实战交流群&#xff08;637326624&#xff09;&#xff0c;…

内存管理(ybtoj-二叉堆)

文章目录题目描述解析代码题目描述 解析 这题感觉做的不错 不难看出&#xff0c;要维护一个空闲的优先队列&#xff0c;在每次申请时弹出编号最小的 但是对判断当前哪些被访问的内存重新进入空闲状态是一个难题 最简单的办法是存起来每次扫一遍判断 但这样在极端数据时会TLE&…

P4233-射命丸文的笔记【NTT,多项式求逆】

正题 题目链接:https://www.luogu.com.cn/problem/P4233 题目大意 随机选择一条有哈密顿回路的nnn个点的竞赛图&#xff0c;求选出图的哈密顿回路的期望个数。 对于每个n∈[1,N]n\in[1,N]n∈[1,N]求答案。 1≤N≤1051\leq N\leq 10^51≤N≤105 解题思路 竟然自己推出来了泪…

HDU 5008 Boring String Problem ( 后缀数组求本质不同第k大子串)

Boring String Problem Zeronera题解 预处理sum数组记录不同字符串的个数&#xff0c;即sum[i] n- sa[i] 1 -height[i] sum[i-1] (n为原串长度) 对于每个k 若k > sum[n] 则输出0 0 &#xff0c;即k大于不同子串的总数 否则&#xff0c;二分sum数组找到第k小子串所在的…

HAPPY_TOGETHER_WEEK15_ENJOY

文章目录7-1 6翻了7-2 幸运彩票7-3 点赞7-4 猜数字7-5 出租7-6 A-B7-7 连续因子7-8 天梯赛座位分配7-9 大笨钟7-10 敲笨钟7-11 整除光棍7-1 6翻了 #include<iostream> #include<string> using namespace std; int main() {string str;int s;int count 0;getline(…

[翻译]初试C# 8.0

原文地址: https://blogs.msdn.microsoft.com/dotnet/2018/12/05/take-c-8-0-for-a-spin/初试C# 8.0昨天我们宣布了Visual Studio 2019的第一个预览版&#xff08;使用Visual Studio 2019提高每个开发人员的工作效率&#xff09;和.NET Core 3.0&#xff08;宣布.NET Core 3预览…

上帝造题的七分钟(ybtoj-树状数组)

文章目录题目描述解析代码thanks for reading&#xff01;题目描述 解析 差点活活恶心死 搬砖题 &#xff08;其实细节没有那么多&#xff0c;还是代码能力太差&#xff09; 利用矩阵的二维差分 加上树状数组搞一搞 就完事了&#xff08;我实在不想再写了 &#xff09; 洛谷…

ACM模板合集

目录数据结构STL以及基础数据结构并查集线段树树状数组平衡树树套树可并堆\sqrt{}​根号数据结构LCT字符串字符串匹配字符串其他数学数论线性代数组合数学网络流最大流最小割费用流图搜索最短路负环最短路建图最小生成树连通性相关欧拉路径二分图树上问题其他离线分治算法随机化…

P6657-[模板]LGV 引理

正题 题目链接:https://www.luogu.com.cn/problem/P6657 题目大意 给出nnn\times nnn的棋盘&#xff0c;mmm个起点第iii个为(1,ai)(1,a_i)(1,ai​)&#xff0c;对应mmm个终点第iii个为(n,bi)(n,b_i)(n,bi​)。 求有多少条选出mmm条四联通路径的方案使得没有路径有交点。 2≤…

STL初步讲解

文章目录sortmapvectorstackqueuepriority_queue初学C&#xff0c;发现经常在文件中有using namespace std这个东西。首先 namespace 这个东西叫做命名空间。using有好几种用法&#xff0c;这里使用的是using的命名空间的使用。 std是C中的一个命名空间&#xff0c;叫做标准命名…

.NET Core微服务之路:让我们对上一个Demo通讯进行修改,完成RPC通讯

最近一段时间有些事情耽搁了更新&#xff0c;抱歉各位了。上一篇我们简单的介绍了DotNetty通信框架&#xff0c;并简单的介绍了基于DotNetty实现了回路&#xff08;Echo&#xff09;通信过程。我们来回忆一下上一个项目的整个流程&#xff1a;当服务端启动后&#xff0c;绑定并…

洛谷:P1831 杠杆数(数位dp)

文章目录描述解析代码thanks for reading&#xff01;传送门描述 如果把一个数的某一位当成支点&#xff0c;且左边的数字到这个点的力矩和等于右边的数字到这个点的力矩和&#xff0c;那么这个数就可以被叫成杠杆数。 比如4139就是杠杆数&#xff0c;把3当成支点&#xff0c…

2021“MINIEYE杯”中国大学生算法设计超级联赛(7)部分题解

前言 找大佬嫖到个号来划水打比赛了&#xff0c;有的题没写或者不是我写的就不放了。 目前只有&#xff1a;1004,1005,1007,1008,1011 正题 题目链接:https://acm.hdu.edu.cn/contests/contest_show.php?cid990 1004 Link with Balls 题目大意 两种盒子各有nnn个&#xff…

Visual Studio 2019 首个预览版本抢先看,有啥新功能?

微软在 Connect 2018 大会上发布Visual Studio 2019 第 1 个预览版本。该预览版本中展示了许多变更&#xff0c;从 IDE 的启动行为&#xff0c;到代码重构功能&#xff1b;从搜索功能的更多用法&#xff0c;到更好的大型项目导航。这个预览版本展现了微软希望尽全力帮助开发人员…

模板:网络流(Dinic算法)

文章目录1.网络最大流题目描述解析反悔边分层&#xff08;避免环流&#xff09;时间优化代码2.费用流描述解析代码1.网络最大流 洛谷P3376 题目描述 给出一个网络图&#xff0c;以及其源点和汇点&#xff0c;求出其网络最大流。 解析 网络流的思想就是在原有的基础上不断进…

NC51272 棋盘覆盖

题目&#xff1a; 给出一张nn(n≤100) 的国际象棋棋盘&#xff0c;其中被删除了一些点&#xff0c;问可以使用多少1*2的多米 诺骨牌进行掩盖。 题解&#xff1a; 先进行黑白染色&#xff0c;相邻的两个黑白就是一个骨牌&#xff0c;又因为一个格子不能放多个骨牌&#xff0c;…