`
Hooopo
  • 浏览: 328850 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个简单的delay server

    博客分类:
  • Ruby
阅读更多
web game里经常出现这样的需求:
1.建造一个房子,等待n秒后建好
2.种植一个植物,等待n秒后完成
3.生产一个汽车,等待n秒后完成
4.升级一个基地,等待n秒后完成
..................
无论是汽车还是房子,建造或升级这个动作很简单,只需要更新一下数据库里的某个字段。
关键是如何处理等待n秒这个操作。

cron + rake
最简单的做法就是后台定时rake,每隔一段时间扫描一下整个表,根据结束时间去改变状态字段。
但是这样作的缺陷很明显,即使扫描的时间间隔再短也达不到准确,还有就是rake每次执行都要加载一次rails环境,然后再释放,这样效率很低。

Delay Job:
看了各种delay job插件,这些插件主要解决的问题是异步的问题,同样达不到精确的计划。

异步线程or进程+sleep n
这种方案看起来不错,但是无论线程还是进程,一直sleep都会占很多资源.

EventMachine
引用
EventMachine是一个基于Reactor设计模式的、用于网络编程和并发编程的框架。Reactor模式描述了一种服务处理器,它接受事件并将其分发给已注册的事件处理。这种模式的好处就是清晰的分离了时间分发和处理事件的应用程序逻辑,而不需引入多线程来把代码复杂化。

好了,神器在手,,看代码:
Delay Server:

#!/usr/bin/env ruby

require 'rubygems'
require 'optparse'
require 'eventmachine'

require 'evma_httpserver'
require 'rack'

options = {
  :Port        => 3000,
  :Host        => "0.0.0.0",
  :environment => (ENV['RAILS_ENV'] || "development").dup
}

ARGV.clone.options do |opts|
  opts.on("-p", "--port=port", Integer,
          "Runs Delay Server on the specified port.", "Default: 3000") { |v| options[:Port] = v }
  opts.on("-b", "--binding=ip", String,
          "Binds Delay Server to the specified ip.", "Default: 0.0.0.0") { |v| options[:Host] = v }

  opts.on("-e", "--environment=name", String,
          "Specifies the environment to run this server under (test/development/production).",
          "Default: development") { |v| options[:environment] = v }

  opts.separator ""

  opts.on("-h", "--help", "Show this help message.") { puts opts; exit }

  opts.parse!
end

puts "=> Delay Server  starting on http://#{options[:Host]}:#{options[:Port]}"


ENV["RAILS_ENV"] = options[:environment]


require(File.join(File.dirname(__FILE__), 'config', 'boot'))
require(File.join(File.dirname(__FILE__), 'config', 'environment'))


class DelayServer < EM::Connection
  include EM::HttpServer

  def post_init
    super
  end

  def process_http_request

    params = Rack::Utils.parse_query(@http_query_string)
    
    response = EM::DelegatedHttpResponse.new(self)
    response.status = 200
    response.content_type 'text/html'

    current_time = Time.now
    response.content = "request time -> #{current_time.to_s(:db)} / delay time -> #{params['delay']}s\n"

    EM::add_timer(params["delay"]) do
      p params["operate"]
      puts Time.now.to_s(:db)
    end

    response.send_response
  end
end


trap(:INT) { exit }

puts "=> Ctrl-C to shutdown server"

EM.run{
  EM.start_server options[:Host], options[:Port], DelayServer
}





Rails Server:
class XxxController < ApplicationController
  def build
   #.................
   system('%Q{curl  "http://0.0.0.0:3000?delay=10&operate=build"  > ./log/delay_server.log 2>&1 &})
   #.................
  end
end



其实rails server与delay server之间通讯可以有多种选择,比如drb
本着简单高效的原则,选择了http协议..
虽然eventmachine是非阻塞io,但是单个进程的吞吐量有限,利用http协议很容易在前面加个nginx,变成一个小集群....




分享到:
评论
18 楼 paranoid945 2010-09-16  
不存在数据库中可以吗
17 楼 Hooopo 2010-09-12  
xds2000 写道
可以在数据库上做一个trigger,不扫表更方便.在做一个UDF发送你的请求.

如果系统使用了二级缓存,像cache_money..在数据库上做trigger,就会出现数据库数据与缓存不同步的现象。。
16 楼 dualface 2010-09-12  
我靠,高射炮打蚊子啊。。。。

假设建造一个房屋需要100秒,玩家点击确认后开始计时。

不需要搞什么后台任务,只需要把这个任务写入数据库。当客户端有请求时,才取出数据进行计算。如果时间未到,服务端直接忽略就行了。

所有其他工作都由客户端进行,比如“还剩下xx秒”都在客户端进行,说白了就是一个模拟计算的过程。
15 楼 xds2000 2010-09-12  
可以在数据库上做一个trigger,不扫表更方便.在做一个UDF发送你的请求.
14 楼 全冠清 2010-09-09  
很显然是第一种
13 楼 Saito 2010-09-09  
hooooopo这个需求让我想到了各种邪恶的网盘. .

由于各种门的存在.网盘的需求量很高.但是网盘不能让你无限制的下载.

然后每次下载都要有delay时间. 类似freakshare这个网盘会记录你的下载记录. 第一次一般等待60秒. 第二次就会变成10分钟.

这个其实也是一个delay server. 有些类似的功能. 不过他不需要保证 建造中断问题.如果离线他会重读60秒.

60秒/10分钟结束会发起一次请求.获得一个下载地址.跟update数据库其实是一样的.

或许可以参考.也是两次请求.


况且现在EM模式并没有解决delay的问题.大家实际上还是在排队..

还有空间啊.
12 楼 ray_linn 2010-09-09  
Hooopo 写道
ray_linn 写道
Hooopo 写道
ray_linn 写道
记录下duration和start time在数据库里
duration,start_time
5,  12:30:52

客户端的javascript access服务器端(比如login,或者客户端计时器到期)的时候,一条select,一条update.

是用户在线时利用前端的timer,不在线时在登录时候同步吗?
这样有一个问题:
比如建造一个房子
如果玩家A在未建造完成之前下线,
虽然玩家A再次上线的时候会得到建造完成的房子,
但是在其他玩家在查看玩家A的建筑的时候是看不到玩家A的房子的...


在其他玩家view你的地理坐标也可以同时触发这个事件吧。。。事实上

currenttime > start_time+duration 可以作为判断标记,来决定显示不显示这个房子。

说得更具体的:假设有个城 (破三国),城里有各种设施,比如厕所、停尸房之类的^_^,城和设施是个一对多的关系:

----- 设施----------------------------------------------
id, city_id, name,type,setup_duration,start_time,level,X-cordinator,Y-Cordinator
--------------------------------------------------------

每次有人(包括自己或者别人)来看这个城的时候,先根据current_time >start_time + duration 来update一下table, 简单的说就是把level+1,start_time清空,再一句select * from 设施 where start_time is empty 就搞定了。

这里用start_time+duration,是因为好像还可以盖某些设施来缩短duration,是个可变量,你也可以用expected_completet_time来代替之。



其实由于前端timer的不可靠性,后台再加上你说的这个同步机制是可以解决问题的。
但是,这样就会检查更新逻辑(可能不止一种这样的场景)混到了其他逻辑(你这个例子里的查看坐标)。。。
这样最终会使很多action里面充斥着各种同步状态的逻辑...很难维护。


我们只是把数据库更新延迟再延迟到有人来查看、改变城的状态(比如敌我查看城市、攻打城市等等),而这个操作可以完全写成一个SP,独立于所有的action,这样就解决了这个问题。。
11 楼 Hooopo 2010-09-09  
ray_linn 写道
Hooopo 写道
ray_linn 写道
记录下duration和start time在数据库里
duration,start_time
5,  12:30:52

客户端的javascript access服务器端(比如login,或者客户端计时器到期)的时候,一条select,一条update.

是用户在线时利用前端的timer,不在线时在登录时候同步吗?
这样有一个问题:
比如建造一个房子
如果玩家A在未建造完成之前下线,
虽然玩家A再次上线的时候会得到建造完成的房子,
但是在其他玩家在查看玩家A的建筑的时候是看不到玩家A的房子的...


在其他玩家view你的地理坐标也可以同时触发这个事件吧。。。事实上

currenttime > start_time+duration 可以作为判断标记,来决定显示不显示这个房子。

说得更具体的:假设有个城 (破三国),城里有各种设施,比如厕所、停尸房之类的^_^,城和设施是个一对多的关系:

----- 设施----------------------------------------------
id, city_id, name,type,setup_duration,start_time,level,X-cordinator,Y-Cordinator
--------------------------------------------------------

每次有人(包括自己或者别人)来看这个城的时候,先根据current_time >start_time + duration 来update一下table, 简单的说就是把level+1,start_time清空,再一句select * from 设施 where start_time is empty 就搞定了。

这里用start_time+duration,是因为好像还可以盖某些设施来缩短duration,是个可变量,你也可以用expected_completet_time来代替之。



其实由于前端timer的不可靠性,后台再加上你说的这个同步机制是可以解决问题的。
但是,这样就会检查更新逻辑(可能不止一种这样的场景)混到了其他逻辑(你这个例子里的查看坐标)。。。
这样最终会使很多action里面充斥着各种同步状态的逻辑...很难维护。
10 楼 ray_linn 2010-09-08  
Hooopo 写道
ray_linn 写道
记录下duration和start time在数据库里
duration,start_time
5,  12:30:52

客户端的javascript access服务器端(比如login,或者客户端计时器到期)的时候,一条select,一条update.

是用户在线时利用前端的timer,不在线时在登录时候同步吗?
这样有一个问题:
比如建造一个房子
如果玩家A在未建造完成之前下线,
虽然玩家A再次上线的时候会得到建造完成的房子,
但是在其他玩家在查看玩家A的建筑的时候是看不到玩家A的房子的...


在其他玩家view你的地理坐标也可以同时触发这个事件吧。。。事实上

currenttime > start_time+duration 可以作为判断标记,来决定显示不显示这个房子。

说得更具体的:假设有个城 (破三国),城里有各种设施,比如厕所、停尸房之类的^_^,城和设施是个一对多的关系:

----- 设施----------------------------------------------
id, city_id, name,type,setup_duration,start_time,level,X-cordinator,Y-Cordinator
--------------------------------------------------------

每次有人(包括自己或者别人)来看这个城的时候,先根据current_time >start_time + duration 来update一下table, 简单的说就是把level+1,start_time清空,再一句select * from 设施 where start_time is empty 就搞定了。

这里用start_time+duration,是因为好像还可以盖某些设施来缩短duration,是个可变量,你也可以用expected_completet_time来代替之。


9 楼 Hooopo 2010-09-08  
ray_linn 写道
记录下duration和start time在数据库里
duration,start_time
5,  12:30:52

客户端的javascript access服务器端(比如login,或者客户端计时器到期)的时候,一条select,一条update.

是用户在线时利用前端的timer,不在线时在登录时候同步吗?
这样有一个问题:
比如建造一个房子
如果玩家A在未建造完成之前下线,
虽然玩家A再次上线的时候会得到建造完成的房子,
但是在其他玩家在查看玩家A的建筑的时候是看不到玩家A的房子的...
8 楼 Hooopo 2010-09-08  
g.zhen.ning 写道
离题问个问题,这个eventmachine做的功能能被node.js取代么?

可以,node里有setTimeout
http://nodejs.org/api.html#timers-84
7 楼 Hooopo 2010-09-08  
刚才简单测试了一下,add_timer方式在并发情况不会出现覆盖现象,在同一时间如果出现处理不了的操作,前一个操作会阻塞后一个,但是每个操作最终还会执行,也就是quakewang说的卡机.
简单测试代码:
#!/usr/bin/env ruby

require 'rubygems'
require 'optparse'
require 'eventmachine'
require 'evma_httpserver'
require 'rack'

options = {
  :Port        => 3000,
  :Host        => "0.0.0.0",
  :environment => (ENV['RAILS_ENV'] || "development").dup
}

ARGV.clone.options do |opts|
  opts.on("-p", "--port=port", Integer,
          "Runs Delay Server on the specified port.", "Default: 3000") { |v| options[:Port] = v }
  opts.on("-b", "--binding=ip", String,
          "Binds Delay Server to the specified ip.", "Default: 0.0.0.0") { |v| options[:Host] = v }

  opts.on("-e", "--environment=name", String,
          "Specifies the environment to run this server under (test/development/production).",
          "Default: development") { |v| options[:environment] = v }

  opts.separator ""

  opts.on("-h", "--help", "Show this help message.") { puts opts; exit }

  opts.parse!
end

puts "=> Delay Server  starting on http://#{options[:Host]}:#{options[:Port]}"



ENV["RAILS_ENV"] = options[:environment]



require(File.join(File.dirname(__FILE__), 'config', 'boot'))
require(File.join(File.dirname(__FILE__), 'config', 'environment'))




class DelayServer < EM::Connection
  include EM::HttpServer

  def post_init
    super
  end

  def process_http_request

    #params = Rack::Utils.parse_query(@http_query_string)
    
    response = EM::DelegatedHttpResponse.new(self)
    response.status = 200
    response.content_type 'text/html'

    response.content = "ok"


    EM::add_timer(10) do
      sleep 0.5
      $count += 1
      p Time.now.to_s(:db) + "--->#{$count}"
    end

    response.send_response
  end
end



trap(:INT) { exit }

puts "=> Ctrl-C to shutdown server"



EM.run{
  $count = 0
  EM.start_server options[:Host], options[:Port], DelayServer
}

ab -c50 -n100 http://0.0.0.0:3000/


控制台输出:
引用

=> Ctrl-C to shutdown server
"2010-09-09 14:51:11--->1"
"2010-09-09 14:51:11--->2"
"2010-09-09 14:51:12--->3"
"2010-09-09 14:51:12--->4"
"2010-09-09 14:51:13--->5"
"2010-09-09 14:51:13--->6"
"2010-09-09 14:51:14--->7"
"2010-09-09 14:51:14--->8"
"2010-09-09 14:51:15--->9"
"2010-09-09 14:51:15--->10"
"2010-09-09 14:51:16--->11"
"2010-09-09 14:51:16--->12"
"2010-09-09 14:51:17--->13"
"2010-09-09 14:51:17--->14"
"2010-09-09 14:51:18--->15"
"2010-09-09 14:51:18--->16"
"2010-09-09 14:51:19--->17"
"2010-09-09 14:51:19--->18"
"2010-09-09 14:51:20--->19"
"2010-09-09 14:51:20--->20"
"2010-09-09 14:51:21--->21"
"2010-09-09 14:51:21--->22"
"2010-09-09 14:51:22--->23"
"2010-09-09 14:51:22--->24"
"2010-09-09 14:51:23--->25"
"2010-09-09 14:51:23--->26"
"2010-09-09 14:51:24--->27"
"2010-09-09 14:51:24--->28"
"2010-09-09 14:51:25--->29"
"2010-09-09 14:51:25--->30"
"2010-09-09 14:51:26--->31"
"2010-09-09 14:51:26--->32"
"2010-09-09 14:51:27--->33"
"2010-09-09 14:51:27--->34"
"2010-09-09 14:51:28--->35"
"2010-09-09 14:51:28--->36"
"2010-09-09 14:51:29--->37"
"2010-09-09 14:51:29--->38"
"2010-09-09 14:51:30--->39"
"2010-09-09 14:51:30--->40"
"2010-09-09 14:51:31--->41"
"2010-09-09 14:51:31--->42"
"2010-09-09 14:51:32--->43"
"2010-09-09 14:51:32--->44"
"2010-09-09 14:51:33--->45"
"2010-09-09 14:51:33--->46"
"2010-09-09 14:51:34--->47"
"2010-09-09 14:51:34--->48"
"2010-09-09 14:51:35--->49"
"2010-09-09 14:51:35--->50"
"2010-09-09 14:51:36--->51"
"2010-09-09 14:51:36--->52"
"2010-09-09 14:51:37--->53"
"2010-09-09 14:51:37--->54"
"2010-09-09 14:51:38--->55"
"2010-09-09 14:51:38--->56"
"2010-09-09 14:51:39--->57"
"2010-09-09 14:51:39--->58"
"2010-09-09 14:51:40--->59"
"2010-09-09 14:51:40--->60"
"2010-09-09 14:51:41--->61"
"2010-09-09 14:51:41--->62"
"2010-09-09 14:51:42--->63"
"2010-09-09 14:51:42--->64"
"2010-09-09 14:51:43--->65"
"2010-09-09 14:51:43--->66"
"2010-09-09 14:51:44--->67"
"2010-09-09 14:51:44--->68"
"2010-09-09 14:51:45--->69"
"2010-09-09 14:51:45--->70"
"2010-09-09 14:51:46--->71"
"2010-09-09 14:51:46--->72"
"2010-09-09 14:51:47--->73"
"2010-09-09 14:51:47--->74"
"2010-09-09 14:51:48--->75"
"2010-09-09 14:51:48--->76"
"2010-09-09 14:51:49--->77"
"2010-09-09 14:51:49--->78"
"2010-09-09 14:51:50--->79"
"2010-09-09 14:51:50--->80"
"2010-09-09 14:51:51--->81"
"2010-09-09 14:51:51--->82"
"2010-09-09 14:51:52--->83"
"2010-09-09 14:51:52--->84"
"2010-09-09 14:51:53--->85"
"2010-09-09 14:51:53--->86"
"2010-09-09 14:51:54--->87"
"2010-09-09 14:51:54--->88"
"2010-09-09 14:51:55--->89"
"2010-09-09 14:51:55--->90"
"2010-09-09 14:51:56--->91"
"2010-09-09 14:51:56--->92"
"2010-09-09 14:51:57--->93"
"2010-09-09 14:51:57--->94"
"2010-09-09 14:51:58--->95"
"2010-09-09 14:51:58--->96"
"2010-09-09 14:51:59--->97"
"2010-09-09 14:51:59--->98"
"2010-09-09 14:52:00--->99"
"2010-09-09 14:52:00--->100"


6 楼 ray_linn 2010-09-08  
记录下duration和start time在数据库里
duration,start_time
5,  12:30:52

客户端的javascript access服务器端(比如login,或者客户端计时器到期)的时候,一条select,一条update.
5 楼 g.zhen.ning 2010-09-08  
离题问个问题,这个eventmachine做的功能能被node.js取代么?
4 楼 QuakeWang 2010-09-08  
Hooopo 写道
QuakeWang 写道
eventmachine的add_timer不合适用来作这个需求,而且他在高并发下如果有相同的delay time会出现后者覆盖前者的情况。

webgame的delay job通常都是在数据库里面直接插入一条什么时间需要作什么事情的记录,后台一个job server每1秒都进行查询看是否有小于当前时间还未完成的job,然后处理掉,如果每秒要处理的事情太多,就会出现所谓的"卡机"。数据库1秒查询一次的代价其实是很小的。


如果出现你说的覆盖的情况,那么每秒处理一个也是必然会卡机的。而且会越卡越多。。
add_timer方式也可以通过增加进程数量方式避免这个问题。而添加多个job server势必又增加了数据库查询。
add_timer方式如果出现你说的情况,还可以加一个定时任务,每隔一段时间把覆盖调的处理掉。



不是每秒处理一个,而是每一秒查询一次,有几个早于当前时间需要完成的任务,就处理几个。玩家说的“卡机”是指原定于12:00:00会完成的任务,由于11:59:59的任务太多,导致处理任务的时间过长,可能到12:00:10才会执行查询,进行处理。

eventmachine用处很多,但是用他的add_timer不合适用在web game这种定时完成任务,你可以拿真实的项目数据做对比压力测试看看,你会发现这个架构和数据库查询相比是没有硬件成本和开发成本优势的,你说的加进程或者定时任务更会让这个架构复杂和不稳定。
3 楼 beneo 2010-09-08  
event actor真是越来越多啊

如果这种delay job的场景更清除一些就好了。。

web game种花种草的,长时间的,我觉得job server来做比较合适

如果是射击,法术即时的,你这个思路也许不错哦
2 楼 Hooopo 2010-09-07  
QuakeWang 写道
eventmachine的add_timer不合适用来作这个需求,而且他在高并发下如果有相同的delay time会出现后者覆盖前者的情况。

webgame的delay job通常都是在数据库里面直接插入一条什么时间需要作什么事情的记录,后台一个job server每1秒都进行查询看是否有小于当前时间还未完成的job,然后处理掉,如果每秒要处理的事情太多,就会出现所谓的"卡机"。数据库1秒查询一次的代价其实是很小的。


如果出现你说的覆盖的情况,那么每秒处理一个也是必然会卡机的。而且会越卡越多。。
add_timer方式也可以通过增加进程数量方式避免这个问题。而添加多个job server势必又增加了数据库查询。
add_timer方式如果出现你说的情况,还可以加一个定时任务,每隔一段时间把覆盖调的处理掉。


1 楼 QuakeWang 2010-09-07  
eventmachine的add_timer不合适用来作这个需求,而且他在高并发下如果有相同的delay time会出现后者覆盖前者的情况。

webgame的delay job通常都是在数据库里面直接插入一条什么时间需要作什么事情的记录,后台一个job server每1秒都进行查询看是否有小于当前时间还未完成的job,然后处理掉,如果每秒要处理的事情太多,就会出现所谓的"卡机"。数据库1秒查询一次的代价其实是很小的。

相关推荐

    devserver:简单的开发服务器

    开发服务器 使用以下支持启动一个简单的开发服务器 延迟支持 静态文件服务器 jsonp(未实现) 镜像 JS 脚本(未实现) 应用程序接口 ?delay=[ms]

    snap7-express-server:一个简单的node.js表达REST服务器以写入siemens徽标

    Snap7 Express服务器一个简单的node.js表示REST服务器即可写入siemens徽标。用法一个端点打开大门。 $ curl --location --request GET ' ...

    Nomster-Server:Nomster 是一种简化“午餐时间吃什么?”的简单方法。 过程

    它提供了一个 REST 接口来处理存储的数据。 什么是诺姆斯特? Nomster 是一种简化“午餐时间吃什么?”的简单方法。 过程。 它提供了同事现有建议的列表。 重要信息 此版本使用 H2 内存数据库。 要使其与您的 ...

    Account Reaper

    但是,您可以在account-server.conf文件的[account-reaper]部分设置delay_reaping值,以延迟实际删除数据。 此时,要取消删除,您必须直接更新帐户数据库副本,将status列设置为空字符串,并将put_timestamp更新为...

    Spring Cloud Finchley SR2全套(集成Spring Gateway)

    框架中的MongoDB项目是我用来作为文件服务器的一个实现,很简单实现了上传下载删除和预览的几个接口,大家可以看源码,有朋友问到秒传怎么做 这里只是简单说一个关键词(MD5)原理自行理解吧 Redis延迟消费的项目是...

    EXTJS总结.txt

    传入一个CSS选择符的参数,然后依据该CSS选择符从当前元素下面,形成期待匹配子节点的集合,也就是“选择”的操作,最后以一个Ext.CompositeElement类型的组合元素的形式返回。如果以Ext.select()调用表示从document...

    Arduino对智能机器人进行简单编程.pdf

    Arduino对智能机器⼈进⾏简单编程 对智能机器⼈进⾏简单编程 Arduino对智能机器⼈进⾏简单编程 对智能机器⼈进⾏简单编程 #include "ESP8266.h" #define TRIG_PIN 5 #define ECHO_PIN A5 #define BEEP_PIN 12 #...

    riemann-ceph:Ceph 的黎曼客户端

    启动一个 Riemann 实例并从一个帐户和机器上运行它,并使用ceph客户端: ./ceph-riemann --delay 10 这将运行ceph report ,解析结果并以极快的速度将它们写入 Riemann。 它将每 10 秒执行一次。 永远。 提供它...

    mob:使用Rust的mio累积回显服务器

    客户客户端只是将一堆消息发送到服务器的一种非常简单的方法。记录中我使用env_logger板条箱。 可以使用以下命令为mob服务器打开日志记录: RUST_LOG=mob_server ./target/debug/mob-server 如果您还想查看mio的日志...

    icq6英文版 最新

    在Contact这个tab里面 可以设定各种Events的 警告颜色,像是好友上 线时昵称会变成蓝色就 是在第一个设定等等, 右边下面有一个 "Auto Hide X sec" 就是要上 ICQ Menu Delay在桌面 上的时间。 Fig. 14 在...

    rcreferrals:raid-craft.de服务器的引荐插件

    一个简单的插件,允许玩家说出谁推荐了他们,并都获得了奖励。 配置 # The timeout after which players cannot say why they came to the server. # 1h, 1d, etc. referral_timeout : " 0s " # The time in ticks ...

    新版Android开发教程.rar

    也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移 动互联网。----------------------------------- Android 编程基础 4 Android Android Android Android 手机新...

    knock:简单的python端口敲客户端

    grongor / knock 使用python3编写的用于端口终止的简单实用程序。 如果您觉得它有用,但您认为它缺少某些功能,请通过创建问题让我知道。 谢谢!基本用法knock your.server.com 1234 8521 4785 选项knock --help将...

    JMeter操作手册大全.docx

    一个应用系统1s能完成多少事务处理,一个事务在分布式处理中,可能会对应多个请求,对于衡量单个接口服务的处理能力,用QPS比较多。 1.1.2.标准 无论TPS、QPS、HPS,此指标是衡量系统处理能力非常重要的指标,越大越...

    ELDK使用与开发手册

    把数据烧入flash中的一个简单而又快速的办法是通过BDM或者JTAG接口的调试器或者flash烧写器。当flash中没有任何数据(比如说一块新的开发板),这种方法是唯一的选择。 我们(强烈推荐)使用Abatron公司的BDI2000...

    03开源NewSql数据库TiDB-Deep Dive into TiDB

    这两点是一个数据库软件的基础功能,作为业务的基石,任何一点抖动或者错误都可能对业务造成巨大的影响。目前已经有大量的用户在线上使用 TiDB,这些用户的数据量在不断增加、业务也在不断演进。 提升 TiDB 在大...

    CISCO 技术大集合

    命令ip nat inside source list 2 pool c2501 overload中的参数overload,将允许多个内部地址使用相同的全局地址(一个合法IP地址,它是由NIC或服务提供商所分配的地址)。命令ip nat pool c2501 202.96.38.1 202.96...

    计算机应用技术(实用手册)

    让默认的就可以了,但是超频玩者是肯定不会放过任何可以提高性能的东西的,所以如果你想在这里让你的电脑提升一点性能的话,就必须慢慢试验,选择一个适当的参数才能让你的计算机达到性能和稳定的最佳状态!...

Global site tag (gtag.js) - Google Analytics