【问题标题】:Client server using WebSphere MQ使用 WebSphere MQ 的客户端服务器
【发布时间】:2013-02-28 00:42:28
【问题描述】:

我在客户端服务器应用程序的两个选项之间进行选择 -

首先 - 采用多线程服务器的 TCP/IP(基于纯套接字)方法并自行管理发送和接收的同步。

第二种 - 使用 WebSphere MQ 方法 (MQI)。基本上是服务器的一个输入队列和一个输出队列。客户端写入服务器输入队列,服务器将回复与一些相关标识符等放入输出队列。因此只需要 2 个队列。服务器程序是多线程的(线程池),多个线程将读取输入队列并写入输出队列。

问题 - 我倾向于第二种方法,但几乎没有疑问 -

  1. MQI 调用线程安全吗?我必须对队列使用MQGETMQPUT 的互斥吗?

  2. 基于 MQ 的方法的性能会低于基于套接字的方法吗?我所说的性能是指两件事。

    一个。 IBM MQ 队列操作通常比直接套接字连接慢吗?

    b. MQGETMQPUT 上的互斥锁会减慢消息处理速度吗?

    c。我计划每秒加载大约 10000 条消息(每个大约 100 字节)。回复大小约为 5 KB(XML 消息)。这对于基于 IBM MQ 的方法来说是一种实际负载吗?

注意 - 语言是 C++,服务器的操作系统是 Solaris。

【问题讨论】:

    标签: c++ multithreading client-server message-queue ibm-mq


    【解决方案1】:

    您描述的用例非常狭窄。它绝不仅仅是“套接字或队列”的情况,而是必须将其他考虑因素纳入业务案例:

    1. 如何监控和管理事物?是否有必要编写所有向 NOC 报告系统健康状况并提供消息统计信息的部分,或者我可以使用 MQ 提供的内容吗?
    2. 我需要排队还是这真的是一个同步应用?
    3. 这真的是点对点还是所涉及的应用程序参与了服务生态系统和上游/下游连接?它还需要集成什么?
    4. 是否需要消息丰富、路由、扇入、扇出、发布/订阅或其他功能?编写代码还是使用 WMQ/WMQ Broker 原生功能?
    5. 连接是否需要身份验证?加密?编写代码还是使用 WMQ 原生功能?
    6. 是否涉及监管合规因素?如果有,审计自定义代码与 COTS 传输的成本是多少?
    7. 该商店是否具备深厚的 C++ 技能并准备在代码的整个生命周期内保持这种深度?
    8. 如何管理连接配置以及它是否无缝支持 HA 和 DR?编写代码还是使用 WMQ 原生功能?
    9. 如何管理异常逻辑和自动重新连接?编写代码还是使用 WMQ 原生功能?

    商业案例必须考虑的不仅仅是原始速度。当两种备选方案都能够满足吞吐量要求时尤其如此。一旦功能需求得到满足,商业案例中就必须考虑所有这些其他方面(以及更多我没有想到的方面)。

    至于具体问题……

    以您希望的方式管理对队列的访问。多个线程竞争相同的消息,但传递给一个线程的消息不会传递给另一个线程。例外情况是消息回滚并再次可用,或者应用正在使用 pub/sub 并有意接收多个消息副本。

    在应用端,调用在会话中是线程安全的。所以所有线程一起使用相同的会话COMMIT。通常一对使用请求/回复的线程协同操作。否则,每个线程一个会话即可满足您的需求。

    至于性能,这是一个苹果与橘子的比较。问题是提供异步消息传输的所有服务、诊断、弹性和其他功能的 C++ 套接字程序是否与该传输一样执行。答案通常是否定的。 WMQ 已经优化了 20 年,只做一件事,而且做得非常好。一个新的自定义 C++ 套接字程序将更快地移动数据,但不提供相同的功能。因此,归结为应用程序是否需要这么少的 WMQ 功能,从长远来看,自定义代码所需的少数功能会更便宜,然后在应用程序的生命周期内维护这些功能。同样,答案通常是否定的。

    有关消息吞吐率的详细信息,请转到SupportPacs 页面并查找名称以 MP__ 开头的那些您需要的平台和版本。即使在普通的硬件上也可以实现 10k MPS 的小消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 2023-03-28
      • 2013-07-22
      相关资源
      最近更新 更多