Phoenix里的每个请求都是由同一个进程处理的么?

作者 jw2013 所属板块 问答
Phoenix里的每个请求都会开启一个新的进程去处理,还是所有的请求都是由同一个进程进行处理的?
7 回复
  • jw2013 发表
    请求由cowboy/ranch处理。根据http://ninenines.eu/docs/en/cowboy/HEAD/guide/architecture/: ``` It uses only one process per connection. The process where your code runs is the process controlling the socket. Using one process instead of two allows for lower memory usage. Because there can be more than one request per connection with the keepalive feature of HTTP/1.1, that means the same process will be used to handle many requests. Because of this, you are expected to make sure your process cleans up before terminating the handling of the current request. This may include cleaning up the process dictionary, timers, monitoring and more. ``` 看来是每一个连接启动一个新的进程。同一个连接里的请求,都由同一个进程处理。不同连接的请求,就由不同的进程处理。
  • hex 发表
    [@jw2013](/users/1) 可以看看cowboy处理请求的流程: ![](http://ninenines.eu/docs/en/cowboy/1.0/guide/http_req_resp.png)
  • hex 发表
    多个进程间的状态协调就用agent,这个在socket编程中非常常见。因为phoenix是多进程的,处理效率比node之流强不少,但是进程间的状态协调不好好处理就容易出各种同步上的错误。
  • curator 发表
    [@hex](/users/5) 点个赞
  • numbcoder 发表
    每个连接都会单独开启一个进程,如果在这个进程内发送错误,进程会退出,但是这并不影响其他进程的运行。这就是 Erlang 的容错性
  • ranger 发表
    [@numbcoder](/users/35) Phoenix有没有设置进程数(连接数)的上限?如果没特别设置上限,然后连接过多了,是直接crash然后supervisor重启,还是怎么搞呢?能不能请教下呢?
  • numbcoder 发表
    [@ranger](/users/61) 具体有没有上限我没看过代码不太清楚。但是连接进程一般都会设置一个超时时间,就是超过设定时间连接没有接受到请求,进程会自动退出。 连接进程不需要重启把,等到下一次请求会重新建立连接