Sinatra 大家来看看这种场景算是因为单线程引起的吗

ch3rub1m · 2015年08月22日 · 最后由 ch3rub1m 回复于 2015年09月04日 · 7592 次阅读

写了一个 Sinatra 程序,其中有两个接口是这样的:

接口 1:处理 GET 请求,根据 url 返回一张图片 接口 2:收到请求后,发出一个请求请求服务器 B 回调本服务器的接口 1 获取图片,然后再将计算结果返回给服务器 A

现在问题出现了,当调用接口 2 的时候,由于请求发出后,服务器 B 需要调用服务器 A 的接口 1,导致服务器 A 无法处理接口 1 的请求,出现阻塞现象

Web 服务器用的 Thin,当我用 ruby -e production app.rb 运行时,是可以同时处理两个请求的 但是用 thin s 命令运行时,却出现阻塞

本人比较菜 请各位大神帮帮忙 说说这是什么问题

是需要多个线程/进程同时工作才行。 话说 Thin 是个 App Server 吧,不能当 Front Web Server 来用的吧?

http://stackoverflow.com/a/17572091/2547108 thin 默认了单线程的问题吧?另外为什么会有 A => B => A 这么奇怪的一个架构,单线程单进程的情况下这跟自杀有什么区别?

#2 楼 @martin91 这有什么奇怪的 假设对每一个用户请求都需要请求一个第三方 api 的话 不就是这个样子吗?

把接口 1 提出一个方法,接口 2 直接调用这个方法,不要自己通过网络请求自己

#3 楼 @acaby 但是没有说外部服务需要返回来调用请求方接口的啊

按目前需求,多进程肯定是必须的,接口 2 已经阻塞一个进程了,系统无法再接受接口 1 的请求。

不知道你对服务器 B 有没有控制,有控制的话可以改为接口 2 直接 POST 图片到服务器 B, 这样会省一个来回,对接口 1 也没有依赖了。

#5 楼 @martin91 看岔了 - - 确实奇怪...就算回调也不是这么个搞法

#7 楼 @acaby 是的,一般回调都是异步的,比如支付或者云计算的资源处理接口那些。第一次碰到这种还要返回来调用自己的,外部服务的数据应该随请求准备好以参数的方式一并提交。

也可能是 thin 的 em 机制造成的,我以前有程序用到 em,在 rainbows 或是命令行下都没有问题,一到 thin 下就卡住 可以试下别的服务容器,puma 什么的,都很容易跑 sinatra 如果别的可以,那可能是他的 em 和你写的 em 代码哪里冲突了

#1 楼 @msg7086 #2 楼 @martin91 #3 楼 @acaby #4 楼 @luikore #5 楼 @martin91 #5 楼 @martin91 #6 楼 @billy #7 楼 @acaby #8 楼 @martin91 #9 楼 @azhao 已经解决啦,谢谢大家的回复,问题是出在线程锁上,thin 有一个--threaded 参数,加上就可以了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号