我需要为 WCF 服务请求实现一个排队机制。该服务将由客户以单向方式调用。这些请求消息应该存储在 SQL Server 数据库中,并且 Windows 服务对消息进行排队。处理请求的时间是可配置的。如果在处理消息时出现错误,最多需要重试 100 次,如果仍然失败则需要终止。
还应该有一种机制来监控一天的交易数量和失败数量。
问题
如果我使用的是 MSMQ,客户端可能会在不知道服务端点的情况下将消息转发到队列。但我正在使用 SQL Server 来存储请求消息。客户端如何将请求发送到 SQL Server?
解决方案是否可行?我们是否有任何文章/书籍解释如何实现上述内容?
在这种情况下防止服务和客户端进入故障状态的步骤是什么?
将传入消息存储到数据库的最佳方法是什么?
实现重试机制的最佳方法是什么?有什么东西已经存在,所以我不必重新发明轮子?
有没有什么书/文章解释这个实现?
注意事项
- 消息的内容将是复杂的 XML。例如,员工的差旅费用项目或员工列表。
阅读
最佳答案
我是一名 DBA,所以这会影响我的回答,但这是我会做的:
- 如果您使用的是 SQL 2005+,请使用 Service Broker 来存储消息 在数据库中而不是将它们存储在表中。你得到一个 有了这个排队机制,这样你就可以摆脱MSMQ了。您还将有一个表,但它只存储对话句柄(本质上是指向消息的指针)以及它尝试发送此消息的次数。最后,您需要某种“死信箱”,用于存放达到重试阈值的邮件。
- 在您的消息处理代码中,执行以下操作:
- 开始交易
- 从队列中接收消息
- 如果重试次数大于阈值,则移至死信箱并提交
- 增加表中这条消息的计数器
- 处理消息
- 如果处理成功,提交事务
- 如果处理失败,则向队列中放入一条内容相同的新消息,然后提交事务
请注意,没有任何计划的回滚。 Service Broker 中的回滚可能很糟糕;如果你在没有成功接收的情况下回滚 5 次,队列将被禁止入队和出队。但是您仍然希望在您的消息处理器在处理过程中死机(即服务器崩溃)的情况下进行交易。
关于c# - 使用 Windows 服务和 SQL Server 在单向 WCF 消息中排队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9702379/