c# - 使用 Windows 服务和 SQL Server 在单向 WCF 消息中排队

标签 c# asp.net .net sql-server wcf

我需要为 WCF 服务请求实现一个排队机制。该服务将由客户以单向方式调用。这些请求消息应该存储在 SQL Server 数据库中,并且 Windows 服务对消息进行排队。处理请求的时间是可配置的。如果在处理消息时出现错误,最多需要重试 100 次,如果仍然失败则需要终止。

还应该有一种机制来监控一天的交易数量和失败数量。

问题

  1. 如果我使用的是 MSMQ,客户端可能会在不知道服务端点的情况下将消息转发到队列。但我正在使用 SQL Server 来存储请求消息。客户端如何将请求发送到 SQL Server?

  2. 解决方案是否可行?我们是否有任何文章/书籍解释如何实现上述内容?

  3. 在这种情况下防止服务和客户端进入故障状态的步骤是什么?

  4. 将传入消息存储到数据库的最佳方法是什么?

  5. 实现重试机制的最佳方法是什么?有什么东西已经存在,所以我不必重新发明轮子?

  6. 有没有什么书/文章解释这个实现?


注意事项

  1. 消息的内容将是复杂的 XML。例如,员工的差旅费用项目或员工列表。

阅读

  1. Logging WCF Request to Database

  2. Guaranteed processing of data in WCF service

  3. MSMQ vs. SQL Server Service Broker

  4. Is it possible to persist and then forward WCF messages to destination services?

  5. WCF 4 Routing Service - protocol bridging issue

  6. https://softwareengineering.stackexchange.com/questions/134605/designing-a-scalable-and-robust-retry-mechanism

  7. Integrating SQL Service Broker and NServiceBus

  8. Can a subscriber also publish/send message in NServiceBus?

最佳答案

我是一名 DBA,所以这会影响我的回答,但这是我会做的:

  1. 如果您使用的是 SQL 2005+,请使用 Service Broker 来存储消息 在数据库中而不是将它们存储在表中。你得到一个 有了这个排队机制,这样你就可以摆脱MSMQ了。您还将有一个表,但它只存储对话句柄(本质上是指向消息的指针)以及它尝试发送此消息的次数。最后,您需要某种“死信箱”,用于存放达到重试阈值的邮件。
  2. 在您的消息处理代码中,执行以下操作:
    • 开始交易
    • 从队列中接收消息
    • 如果重试次数大于阈值,则移至死信箱并提交
    • 增加表中这条消息的计数器
    • 处理消息
    • 如果处理成功,提交事务
    • 如果处理失败,则向队列中放入一条内容相同的新消息,然后提交事务

请注意,没有任何计划的回滚。 Service Broker 中的回滚可能很糟糕;如果你在没有成功接收的情况下回滚 5 次,队列将被禁止入队和出队。但是您仍然希望在您的消息处理器在处理过程中死机(即服务器崩溃)的情况下进行交易。

关于c# - 使用 Windows 服务和 SQL Server 在单向 WCF 消息中排队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9702379/

相关文章:

c# - 我的 C# 代码有什么问题?

c# - 来自类之间递归依赖的 System.StackOverflow 异常

c# - 使用 IIS 中托管的 WCF 处理长时间运行的服务操作的正确方法是什么?

c# - 关注点分离——DAO、DTO 和 BO

c# - 在数据模板中绑定(bind)命令 (XF/Prism)

c# - MySQL 与另外两个表一起创建一个表并使用 C# WinForms 添加记录

asp.net - ASP.NET 页面可以在页面加载完成后进行一些处理吗?

asp.net - 我可以使用附加参数增加 MVC Controller 操作的 ASP.NET 请求的 maxRequestLength 吗?

.net - 如何在没有 IV 的情况下在 .NET 中进行 AES 加密

c# - 什么是 Control.Disposing 属性?