我目前正在设计应该允许访问数据库的系统。假设如下:
- 数据库应该有访问层。访问层应该提供代表数据库表的对象。(这将使用一些 ORM 框架来完成)。
- 想要从数据库中获取数据的客户端,应该首先从访问层获取对象,然后使用这些对象获取数据。
- 客户端可以使用 Python、Java 或 C++。
- 访问层基于Java。
- 不会有很多客户,但他们会处理大量数据。
对我来说很难的问题是应该使用什么技术在访问层和客户端之间传递对象。我考虑使用 ZeroC ICE、Apache Thrift 或 Google Protocol Buffers。有没有人有意见哪个值得使用?
这是我对协议缓冲区的研究:
优点:
- 使用简单,易于上手
- 有据可查
- 高度优化
- 用类java语言定义对象数据结构
- 自动生成 setter 和 getter 的实现以及 Python、Java 和 C++ 的构建方法
- 其他语言的开源投标
- 可以扩展对象而不影响旧版本的应用程序
- 有很多开源的 RpcChanel 和 RpcController 实现(未测试)
缺点:
- 需要实现对象传输
- 对象结构必须在使用前定义,
所以我们不能即时添加一些字段(更新:有这样做的可能性,请参阅评论) - 如果需要读取一个对象的文件,我们必须解析整个文件(相反,在 XML 中我们可以忽略选择的标签)
- 如果我们想使用 RPC 来调用对象方法,我们需要定义服务并交付 RpcChanel 和 RpcController 实现
这是我对Apache Thrift的研究:
优点:
- 提供为支持的语言(类,所有重要的东西)生成源代码的编译器
- 允许在结构中定义可选字段(当我们不对字段设置值时,传输数据的大小较小)
- enable 指出一些“单向”的方法(调用后什么都不返回,客户端不等待服务器关于查询完成处理的回答)
- 支持集合(映射、列表、集合)、对象、原语序列化(反序列化)、常量、枚举、异常
- 大多数问题,错误都得到解决和解释
- 提供不同的序列化方法:(TBinaryProtocol...)和不同的数据交换方式:(TBufferedTransport, TZlibTransport...)
- 编译器为我们可以通过添加一些新方法扩展的语言生成类(结构)。
- 可以向协议(服务器和客户端)添加字段并删除其他旧代码和新代码可以正确交互(更新中的一些规则)
- 启用异步调用
- 便于使用
缺点:
- 文档 - 包含一些错误,有时很难知道问题的根源是什么
- 并非所有问题都被很好地标记(当我们在 Internet 上寻找解决方案时)。
- 不支持服务方法的重载
- 教程仅涵盖节俭使用的简单示例
- 很难开始
ICE ZeroC: 比协议缓冲区更好,因为我不需要自己通过套接字实现对象传递。ICE 还提供了可以提供连接管理的 ServantLocators。问题是:ICE 是否比 PB 慢得多且效率低得多?