Python PHP SOA设计
我正在规划一个中等规模的应用程序,经过一些讨论和会议,我和我的同事们决定使用服务导向架构(SOA)来构建这个应用。以下是我们的简要计划……
我们将采用四层架构……
|-------- database (NoSQL + SQL polyglot store) --------|
|-------- python for all the heavy business logic --------|
|-------- php would talk to python using SOA and render HTML --------|
|-------- front-end (html+css+js) --------|
- 我们会有两台运行Python的机器,一台是用于实时协作的Tornado服务器,另一台则处理非实时的业务逻辑。
- PHP将通过明确的RESTful接口与非实时的机器进行通信。
- 实时协作的机器将直接与浏览器中的JavaScript客户端进行对话。
我有几个问题……
- 你觉得这个设计有没有明显的缺陷?
- 你推荐使用什么最好的传输方式进行RESTful通信——XML、JSON,还是protobuf(protobuf是谷歌使用的)?
- 你认为在Python和PHP层之间使用缓存是个好主意吗?PHP不会直接与数据库通信——只会通过Python。
- 还有其他需要指出的地方吗?
--- 更新 ---
虽然我不能透露这个应用的具体细节,但我想说这个应用本质上是高度协作的,涉及到很多在浏览器中编辑文本的工作。可以想象成类似于Google Docs,但又不完全一样。
PHP层很重要的原因是……
我们需要让Python层完全独立于HTML模板。这个层级甚至不应该知道我们在构建一个Web应用。这样做的原因是我们有多个模板。高级浏览器的HTML相对复杂,有很多控件、鼠标手势事件和AJAX交互。而老旧浏览器(如IE-6、7,FF-2、3等)的模板则简单得多,基本上是“只读”的——没有AJAX交互。
我们还需要为应用的Adobe AIR组件使用第三套模板。如果这个应用成功,公司还计划推出移动和桌面版本。
因此,我们不能在Python层引入HTML。我们可以考虑用另一个Python层(比如Django之类的)来处理模板,但我们认为在PHP中处理模板会更好——因为PHP在模板处理方面非常出色。我们不会添加任何复杂的逻辑——只处理展示的部分。
1 个回答
关于你的想法,我有几点看法:正如Mikko的评论提到的,PHP这一层似乎多余。现在不太清楚它到底能实现什么功能,特别是在它为服务层提供的抽象方面。现代应用设计越来越倾向于用JavaScript和HTML来实现用户界面。既然你已经决定通过HTTP来暴露业务逻辑,那么它也应该负责所有的输入验证和身份验证,所以PHP中间件的工作就不多了。
一个真正的RESTful服务并不限制它支持的输出格式,而是尽量满足请求中的Accept-Content-Type
。至少在Python中,通常支持JSON是最简单的。Protobuf还比较年轻,所以除非你真的需要它提供的严格类型,不然我建议你不要用它。XML从自描述的角度来看是有用的,如果前端和后端是独立开发的,可能会更受欢迎。