一、前言

    上篇说给大家来写C#和Java的方案,最近工作也比较忙,迟到了一些,我先给大家补上C#的方案。

二、使用的插件

    HangFire

一个开源的.NET任务调度框架,最大特点在于内置提供集成化的控制台,方便后台查看及监控,支持多种存储方式;在方案中主要使用定时任务做补偿机制,后期可能会封装一些,能通过页面的形式直接添加任务;

NLog

日志记录框架,方案中使用记录日志,后期可能回集成多个日志框架;

Autofac

依赖注入的框架,应该不用做过多介绍;

SqlSugar

ORM框架,这个从刚开始我就在使用了,在现在公司没有推行起来,不过在上两家公司都留下的遗产,据说还用的可以,当然我还是最佩服作者;

Polly

容错服务框架,类似于Java下的Hystrix,主要是为了解决分布式系统中,系统之间相互依赖,可能会因为多种因素导致服务不可用的而产生的一套框架,支持服务的超时重试、限流、熔断器等等;

RabbitMQ.Client

官方提供的C#连接RabbitMQ的SDK;

三、方案

  模拟一个简单订单下单的场景,没有进行具体的实现。同时建议下游服务不要写在web端,最好以服务的形式奔跑,代码中是Web端实现的,大家不要这么搞。整体上还是实现了之前提到的两种方案:一是入库打标,二是延时队列(这块没有进行很好的测试,但是估计也没有很大的问题);当然也是有一些特点:RabbitMQ宕机情况下无需重启服务,网络异常的情况下也可以进行断线重连。接下来聊下代码和各方插件在系统中的具体应用:

项目结构:

RabbitMQExtensions:

采用Autofac按照单例的形式注入,采用Polly进行断线重连,也开启了自身断线重连和心跳检测机制,配置方面采用最简单的URI规范进行配置,有兴趣参考下官方,整体上这块代码还相对比较规范,以后可能也不会有太多调整;

OrderDal

SqlSugar的一些简单封装,有些小特点:大家可以可以通过配置来实现读写分离,采用仓储设计。如果不太喜欢这么写,也可以参考杰哥的做法

OrderCommon

定义全局异常的中间件,还有包含一些用到的实体等等,这部分代码还可优化拆分一下;

OrderService

生产者和消费者的具体实现,这块我还想在改造一番,将消费和业务分割开,现在写的很凌乱,不建议这么写,先把代码放出来,看看大家赞同不赞同我的这些用法,可以讨论,也欢迎争论,虽然这块代码写的不好,但是其实里面涉及一些RabbitMQ回调函数的用法,也是比较重要的,没有这些函数也就实现不了我上面说那两个特点;

//RabbitMQ宕机以后回调//客户端这块大家不要采用递归调用恢复链接//具体为什么大家可以测试下,这里留点小疑问哈哈connection.ConnectionShutdown += OnConnectionShutdown;

//消费端异常以后回调consumerchannel.CallbackException += OnOnConsumerMessageAndWriteMessageLogException;

Order

具体的调用者,大家应该根据方法名字就能区分出我上面提到的两种方案的设计;

HangfireExtensions

Hangfire定时框架,采用Mysql作为持久层的存储,写的也比较清晰,后期就是针对这些进行扩展,实现在界面就能添加定时任务;

四、结束

  生产端和消费端这段代码写的凌乱,希望大家不要介意这一点,是有原因的,这里我就不说了。希望大家看到闪光点,不要在一点上纠结;下次会加入Elasticsearch和监控部分的时候我会把这块代码改掉,还大家一片整洁的世界;

Github地址:https://github.com/wangtongzhou520/rabbitmq.git  有什么问题大家可以问我;

欢迎大家加群438836709!欢迎大家关注我!

原文地址:https://www.cnblogs.com/wtzbk/p/10908601.html

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

Net Core下使用RabbitMQ比较完备两种方案(虽然代码有点惨淡,不过我会完善)相关推荐

  1. .Net Core下发送WebRequest请求的两种方式

    1.使用RestSharp.NetCore 2.使用WebApi请求方式 转载于:https://www.cnblogs.com/mailaidedt/p/6525501.html

  2. 在ArcEngine下实现图层属性过滤的两种方法

    转自chanyinhelv原文 在ArcEngine下实现图层属性过滤的两种方法 有时候,我们要对图层上的地物进行有选择性的显示,以此来满足实际的功能要求. 按下面介绍的方法可轻松实现图层属性过滤显示 ...

  3. linux删除用户删不了怎么办,Linux下完全删除用户的两种方法

    Linux操作 实验环境:Centos7虚拟机 首先创建一个普通用户 gubeiqing . [root@localhost ~]# useradd gubeiqing [root@localhost ...

  4. linux系统下重启网络服务的两种方法

    linux系统下重启网络服务的两种方法 发布时间:2020-04-02 11:25:25 来源:亿速云 阅读:207 作者:小新 今天小编给大家分享的是linux系统下重启网络服务的两种方法,很多人都 ...

  5. c语言 linux系统 delay,Linux下实现秒级定时任务的两种方案

    Linux下实现秒级定时任务的两种方案(Crontab 每秒运行): 第一种方案,当然是写一个后台运行的脚本一直循环,然后每次循环sleep一段时间. while true ;do command s ...

  6. CentOS7下配置Supervisor自启动的两种方法

    很多网友留言问如何配置Supervisor 自启动,现将如何在CentOS7下配置Supervisor自启动的两种方法整理如下: 一.方法一 直接将启动命令加入到/etc/rc.d/rc.local中 ...

  7. 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...

    java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...

  8. 动态开辟二维数组的两种方案及位体

    动态开辟二维数组的两种方案及位体 一.在静态二维数组中查询数据 二.动态开辟二维数组空间 1.用二级指针的方式开辟 2.用结构体的方式开辟 三.位体 先来回顾一下动态开辟一位数组的方法: #inclu ...

  9. 解决IE6、IE7、IE8、Firefox兼容的两种方案

    转自:http://dyclh.iteye.com/blog/845349 浏览器不兼容,你知道源头吗? 凡事都要知其然,才能知其所以然,前端开发的朋友想毕都会碰到浏览器兼容的问题,今天在网上觅到此文 ...

最新文章

  1. TensorRT Samples: GoogleNet
  2. AAAI2022最新「关系数据因果推理」报告,181页PPT阐述因果推理在网络数据中研究进展...
  3. 刚进入win7系统就提示检测到一个硬盘问题的解决方法
  4. Springboot-添加对jsp支持
  5. 【STM32】FreeRTOS 时间管理
  6. 基本服务-使用大使网关
  7. python对excel数据求和_96、python操作excel求和
  8. Python--协程(gevent模块)
  9. 数据结构-栈(先进后出表)
  10. Java常用的几个Json库
  11. MySQL日期 专题
  12. halcon 深度学习英伟达显卡部署
  13. 关于appium下载安装及环境配置
  14. paper - A Physics-based Noise Formation Model for Extreme Low-light Raw Denoising
  15. conda和pip卸载包的注意事项
  16. Infer静态分析-内存泄漏分析
  17. 苹果手机怎么在照片上添加文字_手机照片如何添加文字?原来方法这么简单,手把手教你学会。...
  18. RabbitMQ基础篇 (一)
  19. 用python写一个下载器
  20. 80后凭栏碎念青春阑珊

热门文章

  1. Java基类共同属性设置_多选择基类的访问属性-Java初学笔记
  2. mysql ldf文件太大_Linux_数据库清除日志文件(LDF文件过大),清除日志: 复制代码 代码如 - phpStudy...
  3. CentOS 7安装nginx+php+mysql环境
  4. Linux shell 编程(七):流程控制语句
  5. Linux Tomcat8 启动堆内存溢出
  6. javascript深拷贝和浅拷贝
  7. ARP-Address Resolution Protocol-地址解析协议
  8. 【1】淘宝sdk装修入门引言
  9. SQLite.NET (32位) 在64位环境中无法正常调试
  10. FluentValidation在C#中是怎么进行数据验证的