Chinaunix

标题: 讨论贴,希望分享下现在工作使用的程序结构 [打印本页]

作者: liuyeid    时间: 2015-04-07 13:31
标题: 讨论贴,希望分享下现在工作使用的程序结构
本帖最后由 liuyeid 于 2015-04-07 13:38 编辑

比如我现在做的苦b工作吧,做银行业务线的。公司的框架(c写的)主要都是这样:
server->switch->worker->front->cups(其它)
server:
就是监听一tcp端口(甚至公司用了10多年的一个框架都是直接fork的),然后通过消息队列送到switch程序
switch:
可能需要处理报文(包括转换什么的)和路由(具体要调用那个交易),然后又通过消息队列发送到worker
worker:
实际的业务程序了
front:
如果worder需要链接银联或人行等,需要调用这个前置,可能是一个前置系统了,也可能是程序的一部分,只是带前置功能
cups:
不是我们的范畴了

公司08年写了个新的server,使用Poll来做,父子进程使用pipe通信,父进程接收回应,通过pipe通知子进程获取回应并发到客户端,这种方式是相对来说是慢的了。不过这种业务注定不会有很大并发
=======
因为以前做过一小段时间的php加运维,并且一直都有玩linux,所以我就很好奇apache和nginx的实现,apache太庞大了,所以最近在看nginx的源码。

因为apache是直接fork的模式,所以业务都在子进程完成(不使用fcgi的情况下,apcahe直接就支持php脚本)。对比公司的程序,就是把switch worker都写在了server里面。

nginx不使用fcgi只能解析静态页面,所以一定要通过fcgi的支持,启动php-fpm进程来解析php的动态网页,nginx里面的rewrite和location可以看作是switch做的是,php-fpm可以看作是workder做的事。

我的问题:
apache的这种方式肯定不适合用在这里。
1. nginx适合吗?nginx使用epoll,和php-fpm也是使用文件描述符,所以epoll可以统一监听,但是现在公司后面的进程都是使用消息队列来通信的,并且nginx直接就到php-fpm(公司现在的程序,还有把switch拆分为了bridge和switch,bridge处理报文,switch路由),毕竟nginx是以高并发著称,如果想要该动公司框架,并且照者nginx fcgi这样的方式套过去,就只有server->worker, 并且使用unix socket或者tcp来通信。这样可取吗?
2. 或者如何解决好在server对客户使用socket,对內使用消息队列。这个在unix 网络编程上作者提到过,但是并没有给出好的解决办法。我想了很久,如果worker不开2个线程,就只有通过父进程告诉子进程了(即公司08年的那个新框架)。
3. 还有个问题,因为刚开始看nginx,想知道,可以直接使用自己的应用层协议写一个模块替换nginx的http或者mail模块来实现自己的tcp的服务器吗


还有一个疑问吧:
都说nginx的并发很高,如果送到php-fpm处理,如果要花费百分之一秒,并且一个nginx的worker链接php-fpm应该是串行的吧,worker的数量和核保持一致,比如10个核,其实实际在处理中的并发也就1000,tcp的链接并发完全有可能是php-fpm处理的成百上千倍,但是根本处理不到,nginx何来高并发,这样来看只有php-fpm处理是万分之一秒或者更少了???

写的比较乱,想的有点多,发现写的比较少










作者: xphh2008    时间: 2015-04-07 18:35
只要你业务对外提供的是http接口,那么用nginx完全没问题。你可以通过编写nginx扩展模块做你想做的任何业务。
作者: xphh2008    时间: 2015-04-07 18:38
另外,nginx的事件模型与异步机制你需要去理解一下。只要业务处理不被io阻塞,nginx并发轻松上十万。
作者: hanxin83    时间: 2015-04-07 20:03
本帖最后由 hanxin83 于 2015-04-07 20:10 编辑

这个问题非常好.

我思考过好几年, 最后指向了关键字:协程.

有大牛语录为证...


如果世界上曾经有那个模型出现过,其他模型都会变成将就.     ----摘自《码农的自我修养》by hanxin83
作者: liuyeid    时间: 2015-04-07 20:09
自己写个其它应用层协议比如ftp来替换http模块,这样靠谱吗?回复 3# xphh2008


   
作者: liuyeid    时间: 2015-04-07 21:01
刚看了下c的协程,有点不好理解呢。但是感觉和我提出的问题没什么关系了??回复 5# liuyeid


   
作者: xphh2008    时间: 2015-04-07 22:30
liuyeid 发表于 2015-04-07 20:09
自己写个其它应用层协议比如ftp来替换http模块,这样靠谱吗?回复 3# xphh2008


nginx一般用于http反向代理,主要focus在web应用上。替换成ftp,我不知道可行性,但不太建议,因为这不是nginx的强项。
作者: BetonArmEE    时间: 2015-04-09 08:39
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2