1
clino 2014-08-10 19:44:54 +08:00 via Android
怎么可能才4个,nginx worker接受到一个请求转发给应用以后在返回前就可以去处理其他请求了,并发数可以很高的
|
2
georgetso OP @clino 哦,原来是这样啊。那是否有可能出现这种情况:
worker1 接收到请求,转发给业务进程,然后 worker1 就玩儿蛋去了 业务进程处理好这个请求后,将结果返回给nginx, 但是却是 worker2 这个接盘侠接收,并将结果返回给客户端? |
3
georgetso OP 如果 nginx 能用各种方式实现真正的超高并发,但是业务进程怎么做到这点呢?
假如服务器每秒收到1万个请求,难道要创建1万个业务进程去处理请求? |
4
jasontse 2014-08-10 20:06:25 +08:00 via Android
nginx 使用 epoll 它是非阻塞的
|
5
georgetso OP @jasontse 感觉回复。但是我2/3楼提到的问题呢?golang哪怕有协程这种并发机制,但是业务进程始终只能一次处理一个请求吧?这个如何做到高并发呢?
以及,哪怕做到了业务进程高并发,但是数据库写操作锁又怎么解决呢 |
6
clino 2014-08-10 21:14:18 +08:00 via Android
@georgetso 我的理解是高并发要在每个环节都要能高并发,nginx能高并发只是说在你的应用环境下它不会成为瓶颈而已,其他环节还要你一一考虑解决
|
7
georgetso OP @clino 是的,我在3楼和5楼也说到了这个。
那么,业务进程怎样做到并发呢?不管是golang的goroutine,还是ios的gcd,都是在一个进程内的并发方案。那么,对于这种成千上万的web请求,有没有办法在1个或少量进程的情况下实现并发处理多个请求呢? |
9
defia 2014-08-11 02:56:11 +08:00 via Android
1。利用channel通讯 少用锁
2。设置GOMAXPROC,这个你可以理解为最大线程数,就可以把goroutine分布到不同的核心上去了。 还有为毛要用fastcgi。直接把特定url丢给golang处理就行了。 |
10
defia 2014-08-11 02:58:11 +08:00 via Android
还有就是一个进程当然是可以同时照顾nnn个请求的,照顾一个那是apache或者php这种阻塞模型。。
|
11
sqbing 2014-08-11 10:15:19 +08:00
分析你的业务流程,分解,使用消息队列分发业务请求
为了让nginx最大程度的发挥高并发特性,最好将业务进程中的IO处理也做成异步 |
12
georgetso OP |
13
defia 2014-08-12 17:46:08 +08:00
@georgetso 数据库这个就跟语言无关了啊..取决于你的具体业务,具体哪些地方需要锁需要事务咯,说全这个可以拿出来单独写一章了..
golang是以同步的形式写异步程序,逻辑上是同步阻塞的,但是底层实际是异步的. |
14
clino 2014-08-12 17:50:19 +08:00 via Android
这部分我只是了解皮毛,没实践经验,只能抛下砖,一般来说写才会锁数据库,读不会,所以读的并发会比较高,要再高可以用cache/主从数据库 等,要不就用非关系型数据库
|
15
clino 2014-08-12 17:57:53 +08:00 via Android
当然像前面写的,要提高并发,最好将所有环节都用异步的方式实现,包括数据库的访问
|
16
clino 2014-08-12 18:09:13 +08:00 via Android
上面写错了,是非阻塞不是异步
|