ASP.NET Core Web API 中集成 DeveloperSharp.RabbitMQ

文章目录


前言

DeveloperSharp.RabbitMQ 是一个专为.NET开发者设计的高阶封装库,旨在极大简化RabbitMQ的集成与操作流程。它通过抽象底层复杂配置,提供极简API,让开发者无需深入理解AMQP协议细节即可快速实现消息队列功能。

一、核心特性与设计理念

极简API设计

  • 仅需掌握三个核心方法即可覆盖大部分消息场景:

    • SendMessage:同步发送消息至指定队列。
    • GetMessage:从队列获取单条消息(立即返回)。
    • UseMessage:持续消费队列消息(长连接模式),通过回调函数处理每条消息。
    csharp 复制代码
    // 发送消息
    RabbitMQHelper.SendMessage("orderQueue", "订单创建:12345");
    
    // 单次获取消息
    var msg = RabbitMQHelper.GetMessage("orderQueue").Message;
    
    // 持续消费
    RabbitMQHelper.UseMessage("orderQueue", message => {
        ProcessOrder(message);
        return true; // 确认删除消息
    });

二、使用步骤

1.配置 RabbitMQ 连接(配置文件设置)

  • 位置要求:配置文件必须位于程序执行目录(如 bin/Debug/netx.x)或项目根目录

  • 文件类型appsettings.json

    csharp 复制代码
    {
      "DeveloperSharp.RabbitMQ": [{
        "HostName": "your-rabbitmq-ip",
        "VirtualHost": "/",        // 可选,默认为 "/"
        "UserName": "your-user",
        "Password": "your-password",
        "Port": 5672               // 默认 5672
      }]
    }

2.发送消息(在 Controller 中)

  1. 在 API 接口中发送消息到指定队列:

    csharp 复制代码
    using DeveloperSharp.RabbitMQ;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    
    namespace DeveloperSharpRabbitMQSend.Controllers
    {
        [Route("api/[controller]/[action]")]
        [ApiController]
        public class MessageController : ControllerBase
        {
            [HttpPost]
            public IActionResult SendMessage(string msg)
            {
            	//同步发送
                RabbitMQHelper.SendMessage("orderQueue",msg);
                // 异步发送(高并发推荐)
        		// await RabbitMQHelper.SendMessageAsync("orderQueue", text);
                return Ok($"消息已发送:{msg}");
            }
        }
    }

3.消费消息(后台服务)

  1. 使用 IHostedService 实现后台持续消费,避免阻塞 API 线程:

    csharp 复制代码
    using DeveloperSharp.RabbitMQ;
    using Microsoft.Extensions.Hosting;
    namespace DeveloperSharpRabbitMQSend.HostService
    {
        public class MyBackgroundService : BackgroundService
        {
            private readonly ILogger<MyBackgroundService> _logger;
            public MyBackgroundService(ILogger<MyBackgroundService> logger)
            {
                _logger = logger;
            }
            protected override Task ExecuteAsync(CancellationToken stoppingToken)
            {
                RabbitMQHelper.UseMessage("orderQueue", message =>
                {
                    try
                    {
                        // 处理消息(如写入数据库)
                        _logger.LogInformation($"收到消息: {message.Message}");
                        return true; // 确认处理成功,删除消息
                    }
                    catch
                    {
                        return false; // 处理失败,丢弃消息
                                      // return null; // 重试消息(重新入队)
                    }
                });
                return Task.CompletedTask;
            }
        }
    }

4.注册托管服务

  • 代码示例

    csharp 复制代码
    builder.Services.AddHostedService<MyBackgroundService>();

三、消息生命周期控制

  • UseMessage 回调中通过返回值决定消息去向:
    • return true:处理成功,删除消息。
    • return false:处理失败,删除消息(可记录日志)。
    • return null:消息重新入队,供其他消费者处理。
    • 异常抛出:中断消费流程(需进程重启)。

四、高级用法

延时队列 & 死信队列

  1. 示例:实现消息过期后转入死信队列

    • 60秒内未消费 → 消息转入死信队列 → 触发CancelOrder逻辑。
    • 60秒后,D盘下生成文件aa.txt,并记录消息。
    csharp 复制代码
    // 创建过期时间为 60 秒的队列
    var orderQueue = RabbitMQHelper.SetQueue("orders_dead", 60000);
    
    // 获取死信队列并消费
    var deadLetterQueue = RabbitMQHelper.GetQueue("orders_dead");
    deadLetterQueue.UseMessage(msg =>
    {
        File.AppendAllText("D:/aa.txt", msg.Message);
        return true;
    });
    
    // 发送订单消息
    orderQueue.SendMessage("延时消息");

五、适用场景与优势

  • 快速集成:适合中小项目快速引入消息队列,无需搭建复杂架构
  • 高并发处理:支持亿级数据量项目
  • 跨平台部署兼容.NET Framework 4.5+ 与 .NET Core 2.0+,支持Docker/Linux/Windows
  • 运维简化:自带长连接管理,减少资源泄漏风险(需注意进程销毁)

六、注意事项

  • 生产环境安全
    • 必须启用SSL/TLS加密传输,避免密码明文暴露
    • 避免使用默认guest账号,需按角色分配权限
  • 资源冲突规避
    • SendMessage/GetMessage/UseMessage务必分离部署(如独立微服务),避免同一进程内资源竞争
  • 消息顺序保证
    • 异步发送(SendMessageAsync)可能导致消息乱序,需业务层设计幂等处理

总结

DeveloperSharp.RabbitMQ 通过屏蔽RabbitMQ底层复杂性,为.NET开发者提供了一套"开箱即用"的消息队列解决方案。

适合需快速构建异步解耦、流量削峰(如电商秒杀)或跨系统联动的应用场景。对于超大规模集群(日处理亿级以上消息),建议结合原生RabbitMQ集群策略进一步优化

相关推荐
milanyangbo5 分钟前
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
分布式·后端·云原生·架构
AAA修煤气灶刘哥34 分钟前
MySQL 查文本查哭了?来唠唠 ES 这货:从 “啥是 ES” 到 Java 撸代码,一篇整明白!
java·后端·elasticsearch
金銀銅鐵36 分钟前
[Java] 浅析密封类(Sealed Classes) 在 class 文件中是如何实现的
java·后端
007php00739 分钟前
Go语言面试:传值与传引用的区别及选择指南
java·开发语言·后端·算法·面试·golang·xcode
唐叔在学习41 分钟前
从MD5到RSA,一文读懂常见的加密算法
后端
javadaydayup43 分钟前
为什么 MyBatis Mapper 接口能像普通 Bean 一样被 @Autowired?
后端·mybatis
考虑考虑2 小时前
Redis8中的布谷鸟过滤器
redis·后端·程序员
Sammyyyyy2 小时前
Node.js 做 Web 后端优势为什么这么大?
开发语言·前端·javascript·后端·node.js·servbay
重庆穿山甲2 小时前
Cola架构深度解析:企业级应用架构设计指南
后端