【发布时间】: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