我目前正在设计应该允许访问数据库的系统。假设如下:
- 数据库应具有访问层。访问层应提供表示数据库表的对象。 (这可以使用一些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 的研究:
优点:
- 提供编译器,为支持的语言(类,所有重要的事情)生成源代码。
- 允许在结构中定义可选字段(当我们没有在字段上设置值时,传输数据的大小更低)
- 启用指出一些“单向”的方法(在调用后不返回任何内容和客户端不等待服务器对查询的完成处理的回答)
- 支持集合(映射,列表,集合),对象,基元序列化(反序列化),常量,枚举,异常
- 大多数问题,错误得到解决和解释
- 提供不同的序列化方法:( TBinaryProtocol ...)和不同的数据交换方式:(TBufferedTransport,TZlibTransport ...)
- 编译器通过添加一些新方法为我们可以扩展的语言生成类(结构)。
- 可以向协议(服务器和客户端)添加字段并删除其他旧代码,新代码可以正常交互(更新中的某些规则)
- 启用异步调用
- 易于使用
缺点:
- 文档 - 包含一些错误,有时很难知道问题的根源是什么
- 并非所有问题都得到了很好的解决(当我们在互联网上寻找解决方案时)。
- 不支持服务方法的重载
- 教程仅涵盖节俭使用的简单示例
- 难以入手
ICE ZeroC:
优于Protocol Buffers,因为我不需要通过例如自己实现对象传递。插座。 ICE还提供ServantLocators,它可以提供连接管理。
问题是:ICE是否比PB慢得多且效率低?