Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript IBM MQ cmit和使用syncpoint回滚_Javascript_Node.js_Ibm Mq - Fatal编程技术网

Javascript IBM MQ cmit和使用syncpoint回滚

Javascript IBM MQ cmit和使用syncpoint回滚,javascript,node.js,ibm-mq,Javascript,Node.js,Ibm Mq,以下概述: 我有一个设置,从IBMMQ读取一组消息,并在k8 cluster env中处理这些消息,然后将其发送到目标主机 问题: 我观察到,有时消息流很大,在将其发送到目标主机之前,我们的pod会失败并重新启动,这样我们就丢失了所有的消息,因为我们正在从中执行读取和删除方法 预期解决方案: 我正在寻找一种解决方案,在这些消息发送到目标主机之前,我们不会丢失消息的跟踪 我的尝试: 在IBM MQ中,我们有一个工作单元的概念,但由于我们不能期望在读取和处理过程中出现延迟,因此我不能等待一条消息得到

以下概述:

我有一个设置,从IBMMQ读取一组消息,并在k8 cluster env中处理这些消息,然后将其发送到目标主机

问题:

我观察到,有时消息流很大,在将其发送到目标主机之前,我们的pod会失败并重新启动,这样我们就丢失了所有的消息,因为我们正在从中执行读取和删除方法

预期解决方案:

我正在寻找一种解决方案,在这些消息发送到目标主机之前,我们不会丢失消息的跟踪

我的尝试:

在IBM MQ中,我们有一个
工作单元的概念
,但由于我们不能期望在读取和处理过程中出现延迟,因此我不能等待一条消息得到处理,然后再读取另一条消息,因为它可能会出现严重的性能下降

代码语言:


NodeJs

正如评论所示,有许多方法可以剥下这只猫的皮,但您需要使用事务

使用事务选项创建连接后,事务范围立即开始。当您提交或回滚时,它将关闭,下一个事务开始

因此,您应该分批处理对应用程序有意义的消息,并在批处理完成时提交。如果您的应用程序被k8s杀死,那么所有未提交的读取消息都将通过退出队列进程回滚,以停止有害消息

添加了一节以显示示例代码和回退队列的解释

在您的正常处理过程中,如果应用程序在有时间处理消息之前停止,您将希望该消息返回到队列。这样消息仍然可以处理

要启用此回滚,您需要在
MQC.MQPMO_SYNCPOINT
中的
中进入获取消息选项

如果一切顺利,你就可以做出承诺

或回滚

如果回滚,消息将返回队列。这意味着这也是你的应用程序将阅读的下一条消息。这可能会生成有害消息循环。因此,您还应该为您的应用程序用户设置一个
回退队列
,其中包含
传递所有上下文
权限和
回退阈值

假设您将阈值设置为5。该消息可读取5次,并可回滚。你的应用程序需要检查阈值,确定这是一条有毒消息,然后将其移出队列

要检查回退阈值(和回退队列名称),可以使用以下代码

获取消息时,应用程序可以使用mqmd.BackoutCount检查消息回滚的频率

我注意到,如果这是在同一个应用程序实例中重复调用同一消息的回滚,那么在阈值处会抛出一个
MQRC_HOBJ_ERROR
ERROR。您的应用程序可以检查该消息,然后丢弃该消息。 如果它是另一个应用程序实例,那么它不会得到
MQRC_HOBJ_ERROR
错误,因此它可以检查回退阈值并丢弃消息,记住提交丢弃操作

有关更多信息,请参阅

作为替代方案,您可以使用keda,它与k8s一起工作
根据等待处理的消息数量(而不是CPU/内存消耗)监视队列深度和规模。这样,当有大量消息等待处理时,您可以放大队列,然后慢慢缩小队列,这样队列就可以管理了。这里有一个入门链接——这个示例适用于Go应用程序,但同样适用于Node.js,因为注释表明有许多方法可以剥除这只猫的皮肤,但您需要使用事务

使用事务选项创建连接后,事务范围立即开始。当您提交或回滚时,它将关闭,下一个事务开始

因此,您应该分批处理对应用程序有意义的消息,并在批处理完成时提交。如果您的应用程序被k8s杀死,那么所有未提交的读取消息都将通过退出队列进程回滚,以停止有害消息

添加了一节以显示示例代码和回退队列的解释

在您的正常处理过程中,如果应用程序在有时间处理消息之前停止,您将希望该消息返回到队列。这样消息仍然可以处理

要启用此回滚,您需要在
MQC.MQPMO_SYNCPOINT
中的
中进入获取消息选项

如果一切顺利,你就可以做出承诺

或回滚

如果回滚,消息将返回队列。这意味着这也是你的应用程序将阅读的下一条消息。这可能会生成有害消息循环。因此,您还应该为您的应用程序用户设置一个
回退队列
,其中包含
传递所有上下文
权限和
回退阈值

假设您将阈值设置为5。该消息可读取5次,并可回滚。你的应用程序需要检查阈值,确定这是一条有毒消息,然后将其移出队列

要检查回退阈值(和回退队列名称),可以使用以下代码

获取消息时,应用程序可以使用mqmd.BackoutCount检查消息回滚的频率

我注意到,如果这是在同一个应用程序实例中重复调用同一消息的回滚,那么在阈值处会抛出一个
MQRC_HOBJ_ERROR
ERROR。您的应用程序可以检查该消息,然后丢弃该消息。 如果它是另一个应用程序实例,那么它不会得到
MQRC_HOBJ_ERROR
错误,因此它可以检查回退阈值并丢弃消息,记住提交
gmo.Options |= MQC.MQGMO_SYNCPOINT 
  mq.Cmit(hConn, function(err) {
    if (err) {
      debug_warn('Error on commit', err);
    } else {
      debug_info('Commit was successful');
    }
  });
  mq.Back(hConn, function(err) {
    if (err) {
      debug_warn('Error on rollback', err);
    } else {
      debug_info('rollback was successful');
    }
  });

    // Remember to or in the Inquire option on the Open
    openOptions |= MQC.MQOO_INQUIRE;

...
    attrs = [ new mq.MQAttr(MQC.MQIA_BACKOUT_THRESHOLD), 
             new mq.MQAttr(MQC.MQCA_BACKOUT_REQ_Q_NAME) ];

    mq.Inq(hObj, attrs, (err, selectors) => {
        if (err) {
          debug_warn('Error retrieving backout threshold', err);
        } else {
          debug_info('Attributes have been found');

          selectors.forEach((s) => {
              switch (s.selector) {
                case MQC.MQIA_BACKOUT_THRESHOLD:
                debug_info('Threshold is ', s.value);
                break;
              case MQC.MQCA_BACKOUT_REQ_Q_NAME:
                debug_info('Backout queue is ', s.value);
                break;
           }
          });
        }
      });

    if (mqmd.BackoutCount >= threshold) {
      ...
    }