WCF和MSMQ - 将消息从队列推送到服务?

时间:2016-05-11 19:17:45

标签: c# .net web-services wcf msmq

我只是想知道这是否可能,或者我是否过度复杂化。

我有一个Web应用程序(让我们称之为中心),需要与在多个工作站上运行的WCF服务进行交互。即,用户将选择要向其发送消息的工作站,并且Web应用程序将需要对每个工作站进行调用。这些工作站不会一直在线,在最差的情况下,可能只有600多个工作站需要一次发送消息。

我正在考虑在中央计算机上运行一个单独的WCF服务,它将作为Web应用程序(中央)和工作站之间的一种“代理”。然后,Web应用程序将使用一个消息列表对此服务进行一次调用,然后该服务将处理此列表并将消息添加到队列中。

从我到目前为止所读到的,工作站将需要轮询这个中央队列的消息,但这似乎会增加开销很多。是否可以在将消息添加到队列时将其推送到工作站?

我之前从未使用过MSMQ而且我对WCF也很新,所以如果有更简单的方法可以告诉你。

1 个答案:

答案 0 :(得分:1)

  

我想在中央计算机上运行一个单独的WCF服务,该服务将作为一种"代理"在Web应用程序(中央)和工作站之间

我没有看到您使用其他服务充当"代理"的任何问题。

  

工作站需要轮询此中央队列以获取消息

我可能会建议你有一个中央"收件箱"要在中央服务器上处理的消息。 "代理"然后在本地处理收件箱。让网站将作业发送给代理。

推送模型

对于工作站,让服务器将消息发送到工作站,而不是让它们从服务器读取。为每个工作站创建一个唯一的队列,该队列位于工作站本身 上。让服务将工作站的目标消息发送到工作站的队列。当代理处理来自中央队列/收件箱的每条消息时,代理会从队列中删除所述消息并移至下一个消息。

MSMQ Performance

通常在MSMQ中,出于缩放原因,网络写入比网络读取更好。所有从同一队列读取的计算机都会对性能造成伤害。换句话说,拥有"中心"服务写入远程队列(MSMQ将负责在机器可用时传输消息)。

  

工作站需要轮询此中央队列以查找消息,但这似乎会增加开销很多

正确。使用BeginRead。轮询会损害CPU和/或浪费好线程。