我的团队正在构build将部署在AWS EC2上的应用程序,并将通过IBM MQ(以前称为WebSphere MQ,以前称为MQSeries)与内部传统系统进行通信。
我们在我们的场所中已经有IBM MQ队列pipe理器。 我们是否也需要在EC2中部署一个? 我们是否需要将它们部署在我们的应用程序将运行的EC2框?
我是IBM MQ的新手,虽然我有一些RabbitMQ的经验。 公司中有许多人在IBM MQ方面拥有丰富的经验,但没有一个是云应用程序。 我已经多次被他们告知,我们需要在应用程序的框中运行一个队列pipe理器,然后它可以转发到其他队列pipe理器,但是在一个临时磁盘的云计算机上,这没有任何意义对我来说 – 它不增加任何可靠性。
我们可以使用EBS卷在EC2机器上部署一个队列pipe理器,这样做会更有意义,并让我们的应用程序与之交谈。 但是,这是否比直接与我们现有的队列pipe理员直接交谈更好?
为了增加一些额外的乐趣,我们不是直接在EC2上部署应用程序,而是在EC2上部署的Cloud Foundry,所以应用程序实例在容器中运行,我们没有太多的影响力。
担心队列pipe理器将被部署到的卷的types不是你应该担心的。 IBM MQ有关于支持哪些卷以及不支持哪些卷的具体指导原则。 查看MQ知识中心获取更多信息。
MQ应用程序可以在本地或远程运行(到队列pipe理器)。
(1)本地连接(绑定模式)到队列pipe理器的MQ应用程序可以使应用程序开发和支持变得更容易,因为没有networking涉及获取和/或放置消息。
(2)远程连接(客户端模式)到队列pipe理器的MQ应用程序要复杂得多。 最近有人在MQ ListServer上发布了类似的问题,这是T.Rob Wyatt的出色反应。
从独立的QMgr到共享集线器的整合有很多问题。 你所问的那个是这些中最机械和无趣的。 正如FJ指出的那样,有一些安全隐患和你自己偶然发现的连接问题。 让我给你一些其他的高级别的总结。 你在多大程度上体验到这些取决于环境当前的独立性以及目前的共享程度。 当切换到客户端时数据完整性是个例外,所以我会先谈谈。
没有消息丢失或重复,订单大多保证:
这需要XA事务性。 XA强加了自己的一套devise约束,其中有问题的应用程序不能故障转移到不同的QMgr。 MQ通常performance得如同每个人似乎都期望的那样,在正常情况下没有消息被重复,丢失或混乱。
杜佩的消息,无序的可能性:
这至less需要单阶段提交。 如果从同步点下的队列中获取消息,并且客户端应用程序在下一个API调用中获得2059,则可以确定该消息将被回滚而不会丢失。 但该应用程序会再次看到它,如果它被正确处理,第一次看起来是一个骗局。 另外,如果应用程序在收到一条消息后在COMMIT上获得了2059,那么只能假定COMMIT失败并再次发出PUT。 与来自GET的“function副本”不同,这会生成多个相同的消息。
持有带有一个或多个GET的事务的通道代理将不会释放消息,直到MQ或TCP超时并终止孤立连接。 由于回滚不一定在应用程序重新连接之前发生,因此后续消息可能不在该同步点之下。 当孤立通道被杀死,消息重新出现在队列中时,它们将被交付,但是订单将被中断。
伪造,丢失消息,可能导致混乱:客户端连接不使用XA,也不使用单阶段COMMIT,可能因上述原因丢失或重复消息或混乱。