ZeroMQ,我们可以使用 inproc: 传输以及 pub/sub 消息传递模式吗

2024-04-24

设想 :

我们正在评估ZeroMQ(具体来说jeroMq)用于事件驱动机制。

应用程序是分布式的,其中多个服务(发布者和订阅者都是服务)可以存在于同一个 jvm 中或不同的节点中,这取决于部署架构。

观察

为了玩玩我创建了一个pub/sub图案与inproc:作为运输,使用 jero mq(版本:0.3.5)

  1. 帖子发布是可以发布的(看起来是发布了,至少没有错误)
  2. 另一个线程中的订阅者没有收到任何内容。

Question

正在使用inproc:随着pub/sub可行的?

尝试过谷歌搜索,但找不到任何具体的内容,有什么见解吗?

代码示例pub/sub with inproc:

使用 jero mq(版本:0.3.5)的 inproc pub sub 的工作代码示例对于后来访问这篇文章的人来说会很有用。一位出版商发布主题A and B,以及两个订阅者接收A and B分别地

/**
 * @param args
 */
public static void main(String[] args) {

    // The single ZMQ instance
    final Context context = ZMQ.context(1);

    ExecutorService executorService = Executors.newFixedThreadPool(3);
    //Publisher
    executorService.execute(new Runnable() {

        @Override
        public void run() {
            startPublishing(context);
        }
    });
    //Subscriber for topic "A"
    executorService.execute(new Runnable() {

        @Override
        public void run() {
            startFirstSubscriber(context);
        }
    });
    // Subscriber for topic "B"
    executorService.execute(new Runnable() {

        @Override
        public void run() {
            startSecondSubscriber(context);
        }
    });

}

/**
 * Prepare the publisher and publish
 * 
 * @param context
 */
private static void startPublishing(Context context) {

    Socket publisher = context.socket(ZMQ.PUB);
    publisher.bind("inproc://test");
    while (!Thread.currentThread().isInterrupted()) {
        // Write two messages, each with an envelope and content
        try {
            publisher.sendMore("A");
            publisher.send("We don't want to see this");
            LockSupport.parkNanos(1000);
            publisher.sendMore("B");
            publisher.send("We would like to see this");
        } catch (Throwable e) {

            e.printStackTrace();
        }
    }
    publisher.close();
    context.term();
}

/**
 * Prepare and receive through the subscriber
 * 
 * @param context
 */
private static void startFirstSubscriber(Context context) {

    Socket subscriber = context.socket(ZMQ.SUB);

    subscriber.connect("inproc://test");

    subscriber.subscribe("B".getBytes());
    while (!Thread.currentThread().isInterrupted()) {
        // Read envelope with address
        String address = subscriber.recvStr();
        // Read message contents
        String contents = subscriber.recvStr();
        System.out.println("Subscriber1 " + address + " : " + contents);
    }
    subscriber.close();
    context.term();

}

/**
 * Prepare and receive though the subscriber
 * 
 * @param context
 */
private static void startSecondSubscriber(Context context) {
    // Prepare our context and subscriber

    Socket subscriber = context.socket(ZMQ.SUB);

    subscriber.connect("inproc://test");
    subscriber.subscribe("A".getBytes());
    while (!Thread.currentThread().isInterrupted()) {
        // Read envelope with address
        String address = subscriber.recvStr();
        // Read message contents
        String contents = subscriber.recvStr();
        System.out.println("Subscriber2 " + address + " : " + contents);
    }
    subscriber.close();
    context.term();

}

The ZMQ inproc运输 http://api.zeromq.org/2-1:zmq-inproc旨在在单个进程内、不同线程之间使用。当你说“可以存在于同一个jvm中或者在不同的节点中“(强调我的)我假设你的意思是你将多个进程作为分布式服务而不是单个进程中的多个线程。

如果是这样的话,那么不,你想做的事情不会起作用inproc. PUB-SUB/inproc在多个线程之间的单个进程中可以正常工作。


编辑以解决评论中的进一步问题:

使用类似交通工具的原因inproc or ipc是因为当您在正确的上下文中使用它们时,它比 tcp 传输更高效(更快)。您可以想象使用混合的传输方式,但是您始终必须在同一传输方式上进行绑定和连接才能使其工作。

这意味着每个节点最多需要三个PUB or SUB插座 - 一个tcp发布者与远程主机上的节点对话,ipc发布者与同一主机上不同进程上的节点进行通信,以及inproc发布者与同一进程中不同线程中的节点进行通信。

实际上,在大多数情况下,您只需使用tcp传输并且只为所有东西旋转一个套接字 -tcp无处不在。它could如果每个套接字负责特定的任务,那么启动多个套接字是有意义的kind的信息。

如果出于某种原因,您总是会向其他线程发送一种消息类型,并向其他主机发送不同的消息类型,那么多个套接字是有意义的,但在您的情况下,从一个节点的角度来看,所有其他节点似乎都是如此是平等的。在那种情况下我会使用tcp无处不在并结束它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZeroMQ,我们可以使用 inproc: 传输以及 pub/sub 消息传递模式吗 的相关文章

随机推荐

  • 从 IValueConverter 获取对 ViewModel 的引用

    是否有一种干净的和 或可接受的标准方式从 IValueConverter 引用 ViewModel 或者这是否打破了 MVVM 模式 基本上 我想根据 ViewModel 的其他属性转换 UI 中的绑定数据 我想这与如何从 IValueCo
  • 由相同数据类型的不同构造函数共享的 Haskell 记录访问器

    关于 Haskell 记录的基本问题 如果我定义这个数据类型 data Pet Dog name String Cat name String deriving Show 以下作品 main do let d Dog name Spot c
  • SEO 友好的 URL 真的会影响页面的排名吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如今 SEO 友好的 URL 非常流行 但它们实际上对 Google 和其他搜索引擎中的页面排名产生有意义的影响吗 如果是这样 为什么 如
  • 稳定标准库 qsort?

    我假设 stdlib 中的旧 qsort 函数不稳定 因为手册页没有提及任何相关内容 这就是我正在谈论的功能 include
  • 部署的 Django 项目出现“列表索引超出范围”错误。本地项目工程

    我的项目在本地计算机上运行正常 但是当我将其部署到服务器时出现错误 异常值 列表索引超出范围 异常位置 get context data中的 var www bias experiment src survey views py 第151行
  • MessageBox.Show() 字体

    有没有办法可以更改 MessageBox Show 中的字体类型以获得更大的尺寸 粗体 斜体样式 您始终可以创建自己的 MessageBox 创建一个新的 Windows Forms 类 using System using System
  • scanf函数返回什么?

    scanf 在以下情况下返回的值是多少 int g int p scanf d g Originally int p scanf d g 我知道签名scanf函数是 int scanf const char format 是什么int该函数
  • 使用带有百分比的 CSS Clip

    我试图在 2 个单独的 div 中仅显示图像的上半部分和同一图像的下半部分 我尝试过使用 CSS 属性clip 但似乎不支持 作为单位 只有我吗 您有只显示一半图像的解决方案吗 更新 5年以上后 CSS Clip 属性现已弃用 考虑使用cl
  • 在远程机器上执行多个命令

    在下面的命令中 我尝试 ssh 命令并执行多个命令 如果任何命令失败 即如果 command1 退出 那么如果 command1 和 commnd 2 退出 否则在远程计算机上执行命令 3 我如何退出 我怎样才能做到这一点 ssh logi
  • 如何使用 Laravel 将二进制数据插入数据库?

    我正在尝试使用 Laravel 4 及其 Eloquent ORM 将二进制数据插入到 PostgreSQL 数据库中 我在迁移中有以下内容 Schema create DataBlobs function table table gt i
  • 如何获取驱动器号和名称(卷标)

    我有一个程序可以告诉我所有硬盘 USB 但它只告诉我驱动器号而不是名称 这是我所拥有的 DriveInfo drives DriveInfo GetDrives Console WriteLine Detected Drives for i
  • 计算一个月的工作日数[重复]

    这个问题在这里已经有答案了 可能的重复 获取给定月份的工作日数 https stackoverflow com questions 8396507 get number of weekdays in a given month 如何计算每个
  • 如何在Android中从url获取字节图像

    我是 android 新手 图像存储在服务器中Base64格式 那么我怎样才能得到它server to 我的项目并使用 Json 对象设置为我的 ImageView 请帮我 任何帮助将不胜感激 尝试这个 首先将 Url 转换为 byte b
  • Django:如何在ajax中返回模型表单集并在模板中使用

    我需要在运行时使用ajax动态地将表单添加到我的表单集中 我指的是使用 Ajax 将表单动态添加到 Django 表单集 https stackoverflow com questions 501719 dynamically adding
  • 为什么 Android webview 仅当 type="number" 而不是 type="text" 时才在键盘中显示“下一步”?

    我有一个带有几个输入字段的表单 因此 我想使用下一个按钮在字段之间导航 但这仅在输入字段类型为 数字 时有效 使用 type text 则不会 这是 Android 3 2 1 中的错误吗 我的输入字段是这样的
  • WPF Datagrid - 如何验证多行并标记所有无效行?

    我有一个包含行的数据网格 其中验证取决于他的兄弟姐妹 到目前为止 我正在使用 BindingGroups 和自定义 ValidationRule 同时验证多行 但我不知道如何更改无效行条目的外观 我返回一个 ValidationResult
  • NSView mouseEntered/mouseMoved 在拖动操作期间未调用(反之亦然)

    我有一个带有透明边框的无边框窗口NSView 当鼠标光标进入透明视图时 应该会出现第二个视图 放置目标 允许用户放置文件 问题是draggingEntered 将文件拖到上方时不会被调用透明视图 因此放置目标视图永远不会出现 透明视图具有正
  • 如何使图像在轮播中居中

    如何使图像在轮播中居中 我使用 bootstrap 教程中的代码尝试了 bootstrap 3 carousel a href Webconte Details 124 img src Webconte Image 124 a div cl
  • R 中函数多态性的建议做法是什么?

    假设我想写一个函数R这是对某些数据进行充分统计的函数 例如 假设函数 调用它foo func仅取决于数据样本的样本均值 为了方便起见 我认为用户可能喜欢传递到foo func随机变量的样本 在这种情况下foo func计算样本平均值 or样
  • ZeroMQ,我们可以使用 inproc: 传输以及 pub/sub 消息传递模式吗

    设想 我们正在评估ZeroMQ 具体来说jeroMq 用于事件驱动机制 应用程序是分布式的 其中多个服务 发布者和订阅者都是服务 可以存在于同一个 jvm 中或不同的节点中 这取决于部署架构 观察 为了玩玩我创建了一个pub sub图案与i