首页 > 关于后台多语言架构的问题

关于后台多语言架构的问题

经常听到说一个比较复杂点的后台可能使用多种语言完成,比如前段通过nginx将所有请求映射到主语言如java,然后程序的某一个部分可能通过python或者php做的,他们之间如何通信?

我想到的可能通过web api接口的方式,但如果这样的话有结果问题:

1 假如通过request-->nginx-->java--php
那么java模块就需要通过http的方式向php模块发起请求,我想这个会不会造成响应时间的增加?
因为正常情况,就是一个http请求,现在相当于代理了,增加了一个等待时间,这个怎么解决?

2 如果是直接将php的接口暴露给客户端(比如浏览器端)session怎么办
假设整个系统某些功能是需要登陆的,而登陆模块的工作是由java完成,那么php提供的借口怎么验证用户登录?


不管是前端的nginx,还是后端的java、php,这些服务都是一个个独立的进程。这些进程有可能运行在同一台服务器上,也可能是运行在同一个网络内的不同服务器上。所以,你的问题实际上是:如何在不同的进程之间通信。

总的来说,跨进程通信有几类方法,包括共享内存、共享文件、消息传递、远程调用等等。具体实现方法上,可以通过socket、管道、消息队列、数据库等等。当然,也可以用更高层的协议,例如HTTP,就是你所说的使用Web API的方法。因为HTTP是无状态短连接,每个请求都需要有创建连接和断开连接的过程,所以确实会造成一定的性能损失。但如果Java和PHP进程是在同一台机器上,或者在同一个千兆局域网内,那通常情况下这种延迟是可以忽略的,因为Web应用的瓶颈通常都在数据库访问上。除非是你的系统压力到了一定数量级,导致网络传输已经成为瓶颈了,这时候你可以首先考虑在应用层改进,例如使用二进制协议,其次可以改成底层一些的协议,例如直接通过socket通信。再不行,就得考虑使用异步通信的方式了。


应该说是一个功能点, 要通过不同的项目实现。


你画那流程nginx应该是在java和php之间吧。http虽然有io开销,但是可以降低系统耦合,并且提供缓存、验证等机制,在你考虑性能问题之前请先确保这个问题是系统性能的瓶颈,不然就可能白费力气。
登录可以oauth,还有基于cookie的session可以把cookie放到主域下面共享session,等等很多办法。


他们之间如何通信?

多语言之间为什么要通讯呢?

假设整个系统某些功能是需要登陆的,而登陆模块的工作是由java完成,那么php提供的接口怎么验证用户登录?

请 Google 一下「单点登录」、「SSO」……

通过nginx将所有请求映射到主语言如java,然后程序的某一个部分可能通过python或者php做的

这是你疑问的重点。

你看看你的桌面,可能安装了各种程序,比如 QQ、Chrome、IE、sublime、PS、美图秀秀……等等。这些软件使用了不同的语言,有C++、Java、Python,这些语言都在 win32 的平台,其乐融融。

当我们聊 QQ 时,首先,QQ 输入窗口得需要和输入法通讯,我们的每个按键都会被输入法软件拦截,我们输入 sf,这两个字母不会显示在 QQ 聊天窗口,而是被 Google Input(我使用 Google 输入法)拦截了,然后输入法先处理一下,最后出现候选词,你按下空格,于是「算法」两个字进入了 QQ 聊天窗口。

当我们使用 Java 处理后台业务逻辑(Java 最擅长这个了),但是 Java 也有不擅长的东西,这时我们就可以在用户请求到达业务处理之前,例如那些验证、缓存等,可以交给其他语言去处理。

典型的应用有 memcached、MQ、……


再举一个例子,还是 QQ 聊天吧,我们需要发送一个图片了,发送之前我们肯定要用 PS 或者美图秀秀美化一下,美化完成后,保存起来,最后用 QQ 发送。

如果把 QQ 比喻成 Java,那么 PS 就是 Python,美图秀秀就是 PHP,我们的逻辑大部分是 Java 做的,但是 Java 不擅长修图,于是我们使用了 Python 或者 PHP,至于到底是用哪个好呢?语言本身没有好坏之分,看开发者的喜好吧。

处理完后放到哪儿呢?

  1. 修完图直接复制 Ctrl + C,然后粘贴到 QQ 聊天窗口,发送。
  2. 修完图保存,然后再 QQ 聊天窗口选择图片,发送。

第一种方式,直接在内存中完成,图片放在临时存储空间:剪切板。第二种方式,放在持久存储空间Persistence,磁盘。

如果是开发网站后台系统,则持久存储空间通常就是 DB,在 Java 三层架构中的持久层,说的就是这个意思。Java 把业务逻辑处理完了,放在数据库中,比如订单信息。

下一步,我们需要处理订单,或者将订单信息发送给客户,可以发送到邮箱、手机、微信、……等终端。在这个子系统中,我们可以使用任何一种语言来完成,而不用去管数据库中的这个订单信息是那种语言产生的。(当我们用 QQ 发送图片的时候,我们也从来没有思考过,这个图片是怎么来的?是网上下载的?是 PS 画的?是用手机照的,还是用单反照的?)

但愿你能听明白。

==END==


1,关于系统间跨语言通信你可以了解下thrift.
2,多系统间用户登陆验证可以了解下CAS等单点登录系统.

【热门文章】
【热门文章】