• Chapter 2 Sockets and Patterns【选译,哈哈】 Part 4 Handling Errors and ETERM


    Handling Errors and ETERM

    ZeroMQ的错误处理理念是快速失败和弹性的结合。我们认为,流程应该尽可能容易受到内部错误的攻击,并尽可能健壮地抵御外部攻击和错误。打个比方,如果一个活细胞检测到一个内部错误,它就会自我毁灭,但它会用一切可能的手段抵抗来自外部的攻击。

    当ZeroMQ检测到外部错误时,它会向调用代码返回一个错误。在一些罕见的情况下,如果没有明显的从错误中恢复的策略,它会安静地丢弃消息。

    有一些简单的规则,从POSIX约定开始:

    Methods that create objects return NULL if they fail.

    Methods that process data may return the number of bytes processed, or -1 on an error or failure.

    Other methods return 0 on success and -1 on an error or failure.

    The error code is provided in errno or zmq_errno().

    A descriptive error text for logging is provided by zmq_strerror(). zmq_strerror()提供了用于日志记录的描述性错误文本。

    有两个主要的异常情况,你应该作为非致命的处理:

    当代码接收到带有ZMQ_DONTWAIT选项的消息且没有等待数据时,ZeroMQ将返回-1并将errno设置为EAGAIN。

    当一个线程调用zmq_ctx_destroy(),而其他线程仍在执行阻塞工作时,zmq_ctx_destroy()调用关闭上下文,所有阻塞调用以-1退出,errno设置为ETERM。

    让我们看看如何干净利落地关闭进程。我们将采用上一节中的并行管道示例。如果我们在后台启动了大量的worker,我们现在想要在批量完成后杀死他们。我们可以通过给worker发个kill消息来实现。这样做最好的地方是sink,因为它真的知道批次何时完成。

    我们怎么把sink和worker联系起来?PUSH/PULL套接字只是单向的。我们可以切换到另一种套接字类型,或者可以混合多个套接字流。让我们尝试后一种方法:使用pub-sub模型向worker发送kill消息:

     1. sink在新端点上创建一个PUB套接字。
     2. worker将他们的输入套接字连接到这个端点。
     3. 当sink检测到批处理结束时,它向其PUB套接字发送一个kill。
     4. 当一个worker检测到这个kill消息时,它退出。
  • 相关阅读:
    文件的操作
    encode,decode,str,bytes
    字符串操作
    suse12安装mysql8.16
    VMware配置共享磁盘安装RAC
    Linux过滤文本并显示过滤文字的上下文
    Linux服务器卸载mysql指南
    oracle 各版本各日志存放位置
    impdp按用户导入
    数据泵expdp定时备份
  • 原文地址:https://www.cnblogs.com/usen521/p/15314041.html
Copyright © 2020-2023  润新知