zoukankan      html  css  js  c++  java
  • 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消息时,它退出。
  • 相关阅读:
    UVA 10617 Again Palindrome
    UVA 10154 Weights and Measures
    UVA 10201 Adventures in Moving Part IV
    UVA 10313 Pay the Price
    UVA 10271 Chopsticks
    Restore DB後設置指引 for maximo
    每行SQL語句加go換行
    种服务器角色所拥有的权限
    Framework X support IPV6?
    模擬DeadLock
  • 原文地址:https://www.cnblogs.com/usen521/p/15314041.html
Copyright © 2011-2022 走看看