使用 C# 和 SQL 服务器的 Amazon SQS

Amazon SQS with C# and SQL Server

我被要求在我们的新系统中使用 Amazon SQS。我们的业务依赖于有一些 tasks/requests 从客户到我们的支持代理,一旦客户提交他的 task/request,它应该在我的 SQL 服务器数据库中排队,并且所有排队的任务应该被分配给不忙的代理,因为流程说代理可以同时处理或处理一个 task/request,所以,如果我有 10 个 tasks/requests 来到我的系统,都应该排队,然后,系统应该将任务转发给现在有空的代理,一旦代理解决了任务,他应该得到下一个任务,否则,系统应该等待任何代理直到完成他当前的任务来分配一个新的一个,当然,tasks/requests 处理中不应该有任何重复......等等。

我现在需要什么?

要求我们根据一段散文来设计一个系统是一项非常艰巨的任务。
SQS 简单来说就是一个云队列系统。根据您的描述,我不确定它会使您的系统变得更好。

首先,您已经将所有内容存储在数据库中,那么为什么还需要将内容存储在队列中?如果您想在数据库中存储内容时使用队列语义,您可以考虑 SQL Server Service Broker (https://technet.microsoft.com/en-us/library/ms345108(v=sql.90).aspx#sqlsvcbr_topic2),它支持 SQL 内的队列。或者,除非你的规模非常大(可能是 100+ tasks/second),你可以只查询 table 以获取需要拾取的任务。

其次,听起来您可能有一个围绕任务的工作流,可以扩展到不仅仅是一个队列来让代理人接他们。例如,您是否对任务进行了任何跟进(通过电子邮件向客户询问他们的服务如何,将任务搁置直到客户回复您等)?如果是这样,您可能需要查看简单工作流服务 (https://aws.amazon.com/swf/) or since you are already on Microsoft's stack you can look at Windows Workflow (https://msdn.microsoft.com/en-us/library/ee342461.aspx)

顺便说一句,默认情况下,SQS 不保证 "only one" 交付,因此如果重复对您来说是个大问题,那么您要么必须自己进行重复数据删除,要么使用 FIFO 队列 (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html)它支持重复数据删除,但限制为 300 transactions/second(又名:大约 100 messages/second 占标准发送 -> 接收 -> 删除 API。使用批处理显然这个数字可能更高,但考虑到你用例听起来您不做大量工作就无法使用批处理。