正常关闭 amqp (and/or) http 守护进程,(以及关于全局变量)
Graceful shutdown of an amqp (and/or) http daemon, (and about global variables)
我写了一个 API 守护进程。它几乎不在循环中处理请求(在处理内部它可以通过 http 和 amqp 调用其他服务,重载 sql 数据库等)。我想找到为它正常关机的最佳方法。所以当它接收到sigterm或中断时,它必须在完成当前请求处理后才退出。我不使用线程,但是,我很困惑,有些库可以。喜欢兔子
所以这不是交易:
begin
processing @request
rescue Interrupt => _
db.close
end
我是这么想的:
$gameover = false
trap('INT'){ $gameover = true }
trap('TERM'){ $gameover = true }
class HardApi < Sinatra::Base
before{ lots of code }
after do
if $gameover
db.close
mq.disconnect
log.info{"The end."}
exit 0
end
end
post('/chat/:id') do |chat_id|
BabblerCtrl.new(@request).upload_file(chat_id)
MQService.publish_to_user(@client_id, chat_id, type: :service, :i_file_uploaded)
end
# etc
end
另外 Ruby 解释器说它不能从陷阱内部使用 Mutex。
所以我的问题是全局变量是此类标志的最佳解决方案,或者有类似信号量的东西,我可以从陷阱中设置?
我为测试而编写的简单脚本可以正常工作,但是我的真实程序有很多调试,我仍然不确定它是否会在产品中工作。
全局变量是执行此操作的好方法,但您可以使事情更有条理:
class HardApi < Sinatra::Base
@@should_exit = false
def self.soft_exit
@@should_exit = true
end
before{ lots of code }
after do
if @@should_exit
# ...
end
end
end
trap('INT'){ HardApi.soft_exit }
trap('TERM'){ HardApi.soft_exit }
因此,当我同时拥有单处理 http 服务器和 amqp 响应程序(或两个)时,似乎全局变量 和 Mutex 工作正常。
这里是取消兔子工人的例子
https://gist.github.com/deemytch/6d3f8fd35a796f6b1cdc1e10a4911cc8
我写了一个 API 守护进程。它几乎不在循环中处理请求(在处理内部它可以通过 http 和 amqp 调用其他服务,重载 sql 数据库等)。我想找到为它正常关机的最佳方法。所以当它接收到sigterm或中断时,它必须在完成当前请求处理后才退出。我不使用线程,但是,我很困惑,有些库可以。喜欢兔子
所以这不是交易:
begin
processing @request
rescue Interrupt => _
db.close
end
我是这么想的:
$gameover = false
trap('INT'){ $gameover = true }
trap('TERM'){ $gameover = true }
class HardApi < Sinatra::Base
before{ lots of code }
after do
if $gameover
db.close
mq.disconnect
log.info{"The end."}
exit 0
end
end
post('/chat/:id') do |chat_id|
BabblerCtrl.new(@request).upload_file(chat_id)
MQService.publish_to_user(@client_id, chat_id, type: :service, :i_file_uploaded)
end
# etc
end
另外 Ruby 解释器说它不能从陷阱内部使用 Mutex。
所以我的问题是全局变量是此类标志的最佳解决方案,或者有类似信号量的东西,我可以从陷阱中设置?
我为测试而编写的简单脚本可以正常工作,但是我的真实程序有很多调试,我仍然不确定它是否会在产品中工作。
全局变量是执行此操作的好方法,但您可以使事情更有条理:
class HardApi < Sinatra::Base
@@should_exit = false
def self.soft_exit
@@should_exit = true
end
before{ lots of code }
after do
if @@should_exit
# ...
end
end
end
trap('INT'){ HardApi.soft_exit }
trap('TERM'){ HardApi.soft_exit }
因此,当我同时拥有单处理 http 服务器和 amqp 响应程序(或两个)时,似乎全局变量 和 Mutex 工作正常。
这里是取消兔子工人的例子
https://gist.github.com/deemytch/6d3f8fd35a796f6b1cdc1e10a4911cc8