请求-响应模式不适用于 em-zeromq

Posted

技术标签:

【中文标题】请求-响应模式不适用于 em-zeromq【英文标题】:Request-response pattern not working with em-zeromq 【发布时间】:2012-02-10 21:10:43 【问题描述】:

我正在尝试使用 em-zeromq gem 实现请求-响应模式,但我无法让响应套接字将消息发送回其处理程序中的请求套接字。我写了一些非常简单的代码来测试它:

em_req.rb

require 'em-zeromq'

client_id = ARGV[0] ? ARGV[0].to_i : 1
message = ARGV[1] || "Foo"

Thread.abort_on_exception = true

class ReqHandler
  attr_reader :received

  def on_readable(socket, messages)
    messages.each do |m|
      puts "Received message from server: #m.copy_out_string"
    end
  end
end

trap('INT') do
  EM.stop
end

ctx = EM::ZeroMQ::Context.new(1)

EM.run do
  conn = ctx.connect(ZMQ::REQ, 'tcp://127.0.0.1:9000', ReqHandler.new, identity: "client#client_id")
  conn.socket.send_string(message)
end

em_rep.rb

require 'em-zeromq'

Thread.abort_on_exception = true

class ResponseHandler
  attr_reader :received

  def on_readable(socket, messages)
    message = messages.first.copy_out_string
    puts "Received message from client: #message"

    socket.send_msg("re: #message")
  end
end

trap('INT') do
  EM.stop
end

ctx = EM::ZeroMQ::Context.new(1)

EM.run do
  socket = ctx.bind(ZMQ::REP, 'tcp://127.0.0.1:9000', ResponseHandler.new)
end

我已经使用推拉模式编写了类似的代码并让它工作,但对于请求-响应,我得到的只是响应代码打印“从 client1 收到消息:Foo”,但回复从未到达请求代码。我怀疑这与在响应代码的处理程序中写入套接字有关,因为当我使用请求路由器模式时也会发生同样的事情。唯一有效的时候是我从服务器发送消息而没有先从客户端发送消息(使用推拉)。

关于可能导致此问题的任何想法? gem 的作者不再维护它,但我想我还是会发布这个问题,希望其他有类似经历的开发人员看到这个问题。

我在 Ruby 1.9.2p290 上使用 em-zeromq 0.2.2。

【问题讨论】:

【参考方案1】:

我在 master 分支中提交了一个修复程序,应该可以解决您的问题,您可以尝试一下吗?

您可以使用 bundler 轻松测试它: 在您的应用程序文件夹中创建一个名为 Gemfile 的文件:

source :rubygems
gem 'em-zeromq', :git => "git://github.com/andrewvc/em-zeromq.git"

并将其添加到您的 ruby​​ 文件之上:

require 'rubygems'
require 'bundler/setup'

最后在应用程序文件夹中运行它($ 是你的提示符):

$ bundle

现在您可以执行您的 ruby​​ 文件,它们将使用来自 github 的最新代码

编辑:我是 em-zeromq gem 的新维护者。

【讨论】:

以上是关于请求-响应模式不适用于 em-zeromq的主要内容,如果未能解决你的问题,请参考以下文章

为啥等待不适用于节点请求模块?

Set-cookie 不适用于 Dot net Core 3.1 中的跨站点请求/响应和 React 设置同站点 cookie 和/或 CORS 问题

CORS 不适用于路由

http 304 响应与缓存控制相结合似乎不适用于 max-age

使用 telnet 的 HTTP 请求没有得到任何响应

Laravel 请求验证不适用于邮递员请求