【问题标题】:Concurrency with EventMachine for a high performance need与 EventMachine 并发以满足高性能需求
【发布时间】:2012-03-17 21:40:28
【问题描述】:

我需要一个高性能的网络 tcp 服务器。我在 EventMachine 中编写了这段代码。

class ReactingServer < EventMachine::Connection
  attr_accessor :packet, :packet_class
  @@packet_count = 0

  def initialize(packet_class)
    super
    @packet_class = eval(packet_class)
    @packet = @packet_class.new
    @@packet_count = 0
  end

  def receive_data(data)
    @packet.clear

    operation = proc do
      @packet.read(data)
      @@packet_count = @@packet_count +1
    end

    call_back = proc do
      puts @packet.inspect
      puts "-------------------#{@@packet_count}------------------------\n"
    end
    EventMachine.defer operation, call_back
  end
end

然后我写了一个 ruby​​ 客户端。

require 'rubygems'
require 'socket'

sock = TCPSocket.new("192.168.15.5", 8181)

500.times do |n|
    packet = "\x00\x01\x1\x0\x1FNazar Hu\x00\x0F\xF\xF\xF\xF\xF\xF"
    sock.send packet, 0
  sleep 0.01
end

我面临的第一个问题是,如果我从客户端删除sleep,许多数据包将无法在服务器端接收。如果我发送 5 个数据包,平均会收到 3 个数据包。为什么会这样。

另一个问题是我的服务器需要在20K 连接附近提供服务,平均每秒有 10 个连接向服务器发送数据包。 EventMachine 是否能够处理这种负载?

【问题讨论】:

  • 一台服务器上的 20,000 个同时连接是很多的连接。
  • 您可以说 20,000 个连接是不正确的。我实际上想说它必须为20K 客户端提供服务。每个客户端会每隔10 minute 向服务器发送请求,平均每秒有 10 个客户端发送数据包。

标签: ruby multithreading rubygems eventmachine


【解决方案1】:

receive_data 不会在每次有人向套接字发送内容时被调用,而是被缓冲。 data 的大小可能从您的几个字节到几个 KB 不等。正确解析数据是您的责任。您可以确定的两件事是,所有发送的数据都将被接收并且顺序正确。

【讨论】:

    【解决方案2】:

    有一篇整洁的文章http://www.slideshare.net/igrigorik/ruby-c10k-high-performance-networking-rubykaigi-09

    我不知道您的主块是什么样的,但是您是否尝试过在 event_machine::server 的开头添加 epoll ?

    EM.epoll
    trap("TERM") { EM.stop }
    trap("INT")  { EM.stop }
    EM.run do
      EM.start_server("0.0.0.0", 8181, ReactingServer, "PacketClass") do
        # ...
      end
    end
    

    另外,这个 eval 看起来有点滑稽。你能把"PacketClass"改为:class =&gt; PacketClass吗?

    我在这里猜你的代码是什么样子的。

    【讨论】:

      【解决方案3】:

      你检查过goliath吗?它基于 EventMachine 和 Fiber。据悉,它可以提供高达 3000 req/s 的服务。

      【讨论】:

      • Goliath 是否也适用于 TCP 和 UDP。同时服务多个20 端口?
      • 恐怕两个答案都是“否”。
      猜你喜欢
      • 2016-11-09
      • 1970-01-01
      • 2021-02-20
      • 2011-09-18
      • 1970-01-01
      • 2016-09-24
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多