Protocol buffers 数据库访问系统技术

Protocol buffers 数据库访问系统技术,protocol-buffers,thrift,ice,Protocol Buffers,Thrift,Ice,我目前正在设计一个允许访问数据库的系统。假设如下: 数据库应具有访问层。访问层应该提供表示数据库表的对象。(这将使用一些ORM框架来完成) 要从数据库中获取数据的客户端,应该首先从访问层获取对象,然后使用这些对象获取数据 客户端可以使用Python、java或C++。李> 访问层是基于Java的 不会有太多的客户,但他们将使用大量的数据 对我来说很难的问题是,应该使用什么技术在访问层和客户端之间传递对象。我考虑使用ZoOC ICE、Apache节约或谷歌协议缓冲区。 有人认为哪一个值得使用吗

我目前正在设计一个允许访问数据库的系统。假设如下:

  • 数据库应具有访问层。访问层应该提供表示数据库表的对象。(这将使用一些ORM框架来完成)
  • 要从数据库中获取数据的客户端,应该首先从访问层获取对象,然后使用这些对象获取数据
  • 客户端可以使用Python、java或C++。李>
  • 访问层是基于Java的
  • 不会有太多的客户,但他们将使用大量的数据
对我来说很难的问题是,应该使用什么技术在访问层和客户端之间传递对象。我考虑使用ZoOC ICE、Apache节约或谷歌协议缓冲区。 有人认为哪一个值得使用吗

这是我对协议缓冲区的研究:

优点:

  • 使用简单,易于启动
  • 有据可查
  • 高度优化
  • 用类java语言定义对象数据结构
  • 为Python、Java和C自动生成setter和getter的实现以及构建方法++
  • 其他语言的开源投标
  • 对象可以在不影响应用程序旧版本的情况下进行扩展
  • 有许多开源RpcChanel和RpcController实现(未经测试)
缺点:

  • 需要实现对象传输

  • 对象结构必须在使用前定义,因此我们不能动态添加一些字段(更新:有可能这样做,请参阅注释)
  • 如果需要读取一个对象的字段,我们必须解析整个文件(相反,在XML中,我们可以忽略所选的标记)
  • 如果我们想使用RPC调用对象方法,我们需要定义服务并交付RpcChanel和RpcController实现
这是我为Apache Thrift所做的研究:

优点:

  • 提供为支持的语言(类,所有重要的东西)生成源代码的编译器
  • 允许在结构中定义可选字段(当我们不在字段上设置值时,传输数据的大小较小)
  • enable指出一些“单向”的方法(调用后不返回任何内容,客户端不等待服务器关于查询完成处理的回答)
  • 支持集合(映射、列表、集)、对象、原语序列化(反序列化)、常量、枚举、异常
  • 大多数问题、错误都得到了解决和解释
  • 提供不同的序列化方法:(TBinaryProtocol…)和不同的数据交换方法:(TBufferedTransport,TZlibTransport…)
  • 编译器为解冻语言生成类(结构),我们可以通过添加一些新方法进行扩展
  • 可以向协议(服务器和客户端)添加字段并删除其他-旧代码和新代码可以正确交互(更新中的一些规则)
  • 启用异步调用
  • 易于使用
缺点:

  • 文档-包含一些错误,有时很难了解问题的根源
  • 并不是所有的问题都有很好的标记(当我们在互联网上寻找解决方案时)
  • 不支持服务方法的重载
  • 教程仅介绍节俭使用的简单示例
  • 很难开始
ICE ZeroC: 比协议缓冲区更好,因为我不需要实现自己通过套接字传递的对象。ICE还提供ServantLocator,它可以提供连接管理。
问题是:冰是否比铅慢得多、效率低得多?

显示出一些努力。你为什么要考虑ZeroC?你认为谷歌协议缓冲区的优势是什么?为什么您认为Apache Thrift非常适合?协议缓冲区相对于Thrift的一个优势是第三方实用程序要多得多。我认为为协议缓冲区编写实用程序比编写Thrift要容易得多,因为proto定义可以转换为协议缓冲区消息,并且协议缓冲区具有动态消息。(我最近没有检查thrift,所以这可能已经改变)“因此我们不能动态添加一些字段”是不正确的;许多PB API支持扩展字段。我发现,ICE可以使用ProtocolBuffers:。这是ICE的优势。protobuf还启用可选字段。