Windows上替代MSMQ的队列选择?

33
如果您想在运行 .NET 2.0 及以上版本的 Windows 系统下使用队列产品来实现持久化消息传递,今天有哪些MSMQ的替代品可用?我知道ActiveMQ (http://activemq.apache.org/),并且我看到过WSMQ的参考资料(指向http://wsmq.net),但该网站似乎已经无法访问。

还有其他替代方案吗?


1
该网站(http://wsmq.net)并没有崩溃,但域名正在出售。这意味着WSMQ已经失效了! - Simple Fellow
8个回答

20

可能不是“最佳实践”建议...但基于实际需求和经验:

我们有分布式系统,60个箱子每个运行10个客户端都执行任务X,并且他们需要从队列中获取下一个任务。队列由另一个“客户端”提供...

我们曾使用过进程间通信,尝试了 MSMQ 和服务代理,但长期来看都无法解决问题,因为你将应用程序的控制权交给了微软。只要满足你的需求它就工作得很好,但当你需要一些不支持的东西时,它就会变得糟糕。

对我们而言,最好的解决方案是:使用 SQL 数据库表作为队列。不要重新发明轮子,因为你会犯错误(锁定)。有关如何完成此操作的信息已经在网上,非常容易,我们处理了每天超过 200K 条消息(同时有 60x10 = 600 个并发读写队列)。这是在同一台 SQL 服务器处理应用程序其他内容的基础上进行的...

MSMQ 不起作用的一些原因:

  1. 当你需要更改队列逻辑以不是先进先出(FIFO),而是像“最古老的 RED 消息”或“最老的 BLUE 消息”这样的东西时,你无法做到。(我知道人们会说,你可以通过拥有“红队列”和“蓝队列”来做到...但如果队列的数量/类型是根据应用程序的管理方式动态改变并且每天都在变化怎么办?)

  2. 它增加了一个故障点和部署噩梦(队列是一个故障点,你需要处理设置所有盒子的正确权限以读/写消息等等,在企业软件中,你为这些类型的事情付出了巨大的代价)。SQL 服务器...所有客户端都已经从数据库中读取/写入,只是再加一个表而已。


15
使用SQL Server并不能完全替代MSMQ的所有功能。如果使用MSMQ的正确方式,每个箱子在中央服务器离线时都可以工作(只要有足够的消息被传递以保持它们繁忙)。对于您的场景(在线情况下分发工作),使用SQL是有意义的,但我不确定它是否是MSMQ的普遍“替代品”。 - Paul Stovell
2
这是一个队列,为什么你想要一个非FIFO队列呢?那不就不是队列了吗。 - Liam
3
更不用说在某些系统中,24小时内200,000条消息根本算不了什么。 - zaitsman
@csmba 我把“Q”改成了“队列”,因为“MQ”是消息队列的缩写。(Q指的是完全不同的东西;-) - jpaugh

11

我无法表达关于Tibco EMS的好评。Tibco EMS是Java JMS消息规范的一个实现。Tibco EMS对.NET客户端具有出色的支持,包括WinCE上的紧凑框架.NET。(他们也有C客户端库。)

因此,如果您正在构建涉及在Windows、Unix(AIX/Solaris)、Linux或Mac OS X上运行的消息代码的异构分布式应用程序,那么Tibco EMS就是最佳选择。

查看我的文章:

使用JMS进行分布式软件开发

我曾经在微软工作过,并且在那里进行了一些MSMQ的实现。但是你知道,微软只关心Windows。他们依赖第三方为其他平台提供MSMQ客户端。我与Tibco EMS的接触是一个更好的经验。显然,Tibco比Microsoft更了解消息传递。而且Tibco还努力支持各种客户端绑定。这就是为什么他们最终将产品名称从Tibco JMS更改为Tibco EMS(企业消息服务)的原因。

我确实建立了围绕Tibco EMS的异构软件系统。通过Tibco EMS消息交互,滚动C# .NET Winform客户端与Java/JBoss中间件。 (还有使用紧凑框架。.NET Tibco客户端的WinCE工业嵌入式计算机。)

我的JMS作品链接


10

RabbitMQ框架似乎在这里被忽视了。如果有人仍然关心,它具有.NET 2.0代码基础,并且配备了类似于netMsmqBinding的WCF绑定。该绑定自然需要至少.NET 3.0,并且比内置的netMsmqBinding具有更多功能。最重要的是,它对Mono也很友好。这值得一看。


4
需要注意的是:需要进行一些复杂的Erlang设置。 - Dan Esparza
1
@DanEsparza 每次我安装Erlang都非常简单。 - Ronnie Overby

7

3
为什么不使用ActiveMQ呢? :)

3

可能值得明确指出的是:IBM为WebSphere MQ提供了.NET客户端库。任何.NET应用程序都可以将消息排队,然后在另一个平台上的另一个应用程序(比如主机上的Java应用程序)中将其出列。 - Cheeso
我们在 VMS 上使用 C 编程语言的 Websphere MQ - 它非常稳健。 - Matt

1

Redis是这个平台上另一个热门品种。请查看他们基于Set的队列实现以及Pub/Sub模式。它看起来很有前途。


1
Redis(截至目前)目前在Windows上没有官方支持。 - aryeh
@Aryeh,你对于给予downvotes还是有些害羞了!但现在已经存在一个Windows端口,所以我不会给你downvote。 - jpaugh

1
如果高可用性很重要,那么值得考虑使用Amazon SQS。如果消息来自不同的物理位置,也没有太多额外的开销。价格便宜且可扩展!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接