宣布 MongoDB Perl 驱动程序 1.0

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

Perl 驱动程序团队很高兴地宣布发布 v1.0.0(“v1”) MongoDB Perl 驱动程序

下一代 Perl 驱动程序的目标

下一代 MongoDB 驱动程序公告 中,我们描述了为什么下一代驱动程序遵循一组通用的行为规范文档。鉴于以前的驱动程序编写的非常特殊,现在每个驱动程序都旨在通过相似的 API 提供相似的底层行为,同时仍然努力使其语言符合习惯。

例如,v1 Perl 驱动程序在 MongoDB::Collection 中实现了新的 MongoDB 驱动程序 CRUD API 规范 ,因此 CRUD 操作在驱动程序和 mongo shell 中的行为相似。同样,它实现了 服务器发现和监控 以及 服务器选择 规范,以实现更可预测的网络操作和故障转移。

然而,对于这个下一代 Perl 驱动程序,我们有几个超越跨驱动程序一致性的目标。特别是,我们希望通过解决“v0”驱动程序版本中的一些重大痛点来改善用户体验。

改进了 API 和错误处理的一致性

在 v0 驱动程序中,API 的许多部分在方法之间甚至方法内部都不一致。返回值、选项传递样式或错误处理几乎没有韵律或原因。

例如,在 v0 驱动程序中, update 命令可以返回“1”或可以返回哈希引用,具体取决于是否正在使用写关注。这意味着单纯的配置更改实际上会更改方法调用的返回类型,除非经过检查,否则很容易导致运行时错误。

同样,v0 驱动程序有多种报告失败的方法,包括抛出异常、返回假值、返回字符串值(而不是散列引用)或返回必须检查 ok 字段的散列引用。即使文档没有提及,任何涉及网络 I/O 的方法都可能在网络错误时抛出异常。这些不一致可能会导致错误和意外。

v1 API 实现了 CRUD API,并为用户需要的最常见操作提供选项传递和返回类型的一致性。其他 API 也进行了类似的扩展或修订。

在 v1 驱动程序的错误处理端,错误现在通过抛出异常对象一致地发出信号。异常对象在 MongoDB::Error 中描述,并包括有关错误的结构化数据(在适当的时候),供希望检查它的应用程序使用。

更好的封装和抽象

在 v0 驱动程序中,过多的低级别内部操作作为公共 API 的一部分公开,这使维护工作变得复杂。 v1 API 封装了内部操作并弃用、删除或私有化了大多数遗留的低级功能。目的是尽量减少暴露给最终用户开发人员的“公共界面”,以便在未来更快地开发功能并降低损坏风险。

另一方面,在许多情况下,某些 v0 方法的返回值只是 MongoDB 服务器发送的原始结果文档。这使应用程序开发人员暴露在服务器返回文档格式、字段或语义随时间变化的情况下。随着 CRUD API 的实现,方法返回带有检查方法的结果对象。这可以保护最终用户,因为驱动程序将补偿一致结果对象 API 背后的服务器端结果文档更改。

改进的服务器兼容性和功能支持

MongoDB 服务器在不断发展和改进,但 v0 驱动程序并没有完全跟上步伐。 v1 驱动程序在内部使用写命令而不是用于写的遗留(即将弃用)有线协议实现所有写操作,这提高了错误检测的可靠性和粒度。

在 v1 驱动程序中,SSL 支持是通过 IO::Socket::SSL 提供的,如果需要,用户可以向其传递自定义 SSL 配置参数。这提供了对 X509 证书身份验证和 SSL 服务器证书验证的完全支持,这两者都是 v0 驱动程序所缺少的。

更多的可移植性和减少的依赖性

v0 驱动程序有一个大的依赖树和大量不可移植的 C 代码,特别是用于网络、SSL 和 SASL 身份验证。 v1 驱动程序现在依赖广泛使用、经过良好测试的 CPAN 模块来代替除 BSON 编码/解码之外的所有自定义 C 代码。此更改提高了整体可靠性和平台兼容性。它还为未来的“纯 Perl 可选”驱动程序奠定了基础,该驱动程序具有适用于没有可用编译器的部署环境的纯 Perl BSON 实现。

值得注意的是,v1 驱动程序将其 OO 框架从 Moose 切换为 Moo 。此更改大大减少了 CPAN 模块依赖项的数量,并实现了多项性能改进。通过这个和其他更改,v1 驱动程序将运行时“深度依赖树”(即包括依赖项的依赖项)从大约 50 个 CPAN 库修剪到大约 30 个——减少了 40%。

改进的 BSON 支持

Perl 驱动程序的 BSON 实现负责将类型化的 BSON 数据映射到 Perl 的动态类型变量(和选择类),然后再映射回来。将类型化数据与 Perl 的通用标量变量相互转换存在固有的歧义。将类型化 BSON 变量解码为 Perl 标量时,类型信息会丢失,除非它被解码为受祝福的对象以表示类型。

在许多情况下,v0 驱动程序 BSON 实现默认会丢失 BSON 类型信息,从而使数据往返不可能。 v1 驱动程序在默认情况下对 BSON 编码和解码进行了重大改革,以正确地往返数据——至少在最大程度上可以使用像 Perl 这样的无类型动态语言。

具体变化要点

正如您可能想象的那样,鉴于这些目标,v1 驱动程序包含大量更改,详尽详尽地列在 更改日志 中。幸运的是, MongoDB::Upgrading 文档总结了应用程序开发人员在升级到 v1 驱动程序之前需要注意的更改。

下面列出了该文件的一些要点:

配置

在 v1 驱动程序中,MongoDB::MongoClient 获得了许多新的配置选项来控制服务器选择和超时。此外,客户端配置现在是不可变的;以前的读/写属性现在都是只读的。对写入关注等选项的更改现在直接在数据库或集合级别完成,如后文所示。

一个方便的更改是,现在可以直接从“MongoDB”命名空间 connect 方法使用标准连接字符串 URI 创建 MongoDB::MongoClient 对象:

MongoDB::MongoClient 的选项可以作为可选的哈希引用传递。

为了避免服务器发现中的歧义,副本集现在需要一个明确的副本集名称。如果没有副本集名称,将建立“直接连接”,例如将管理命令发送到副本集中的辅助节点。

一些现有选项(例如 timeout )已弃用,取而代之的是更具体的选项( connect_timeout_ms );其他的在它们不再适合客户端 API ( find_master ) 的新范例时被完全删除。

延迟连接

在 v1 驱动程序中,创建 MongoDB::MongoClient 对象不再立即连接到服务器。这是所有官方 MongoDB 驱动程序的新标准,但如果 MongoDB 不可用,可能会破坏预期从 new 立即出错的代码:

相反,创建一个客户端对象并在 eval 块中执行实际工作。

故障转移

对惰性连接的更改将客户端连接、重新连接和错误处理置于同等地位。每当无法取得进展时,就会抛出错误。确切的情况将决定确切的 MongoDB::Error 对象和消息(例如超时、网络错误、无主错误等)。通常,对于任何与网络相关的错误,与服务器的连接都会关闭。如果异常得到处理,下一次与服务器通信的尝试将自动尝试重新连接。对于副本集,这意味着当新的主节点准备就绪时它将故障转移到新的主节点。

验证

鉴于不可变的客户端配置、延迟连接和自动故障转移,身份验证现在仅基于配置选项,并在建立任何服务器连接时立即发生。这是所有官方驱动程序的另一项更改,它协调了 MongoDB 不同身份验证机制的行为,其中一些只能在连接时发生,而另一些可以在以后完成。

这不会改变已经在 MongoDB::MongoClient 构造函数参数中提供身份验证凭据的驱动程序的行为。但是, authenticate 方法已被删除,依赖它的代码将需要更新。

作为协调身份验证凭据处理的副作用,只有一组凭据可能与单个客户端对象相关联。依赖多次调用 authenticate 来对多个数据库进行身份验证的代码将需要重新编写以改为使用多个客户端对象。

阅读偏好并写下疑虑

读取首选项和写入关注现在表示为对象。因此,它们可以在客户端、数据库或集合对象级别进行设置。现在配置是不可变的,临时更改这些是通过克隆具有修改配置的对象来完成的。

例如,要临时更改给定集合的写入关注,现在可以使用 clone 方法:

BSON编解码

各种 $MongoDB::BSON::... 全局变量已被删除,因为 BSON 编码现在封装在 bson_codec 属性中。与读取首选项和写入关注点一样,它可以针对每个客户端、每个数据库或每个集合进行设置。 MongoDB::Collection 上存在一个特殊的 with_codec 方法,用于通过更改 BSON 编码/解码来简化克隆:

作为一项新的优化,整数现在默认编码为适合的最小 BSON 整数类型,而不是总是占用等于解释器编译整数大小的固定大小。在上面的示例中,在 64 位 perl 上,“42”仍将作为 32 位整数而不是 64 位整数转换为 BSON。

此外,所有常见的 JSON 布尔类现在都将正确编码,并且 Time::Moment 支持编码和解码日期时间。

弃用

几乎所有现有的 MongoDB::Collection API 都已弃用,取而代之的是 MongoDB Driver CRUD API 的实现。已弃用的方法现在没有记录,但大部分仍像以前一样工作。其他类中的一些方法也已弃用。我们鼓励您尽快过渡到新的 API。

下一步

随着 v1.0.0 Perl 驱动程序的发布,该团队正在转向下一组增强功能。目前,我们希望 v1.2.0 驱动程序包括:

  • 支持(即将推出的)MongoDB 3.2 功能
  • 修订和增强的 GridFS API
  • 额外的性能改进

尽管我们对 v1 版本感到兴奋,但我们知道没有软件是没有错误的。我们邀请您在我们的 JIRA 问题跟踪器 上提交错误报告、功能请求或有关 MongoDB Perl 驱动程序的一般反馈。

想要更多 MongoDB?阅读我们的白皮书,了解 MongoDB 3.0 的最新功能:

MongoDB 3.0 的新特性

关于作者 - David Golden

David 活跃于开源软件领域超过 15 年,特别重视 Perl 语言和社区。他是维护核心 Perl 源代码的“Perl 5 Porters”的成员。

他目前在 MongoDB 担任高级软件工程师。此前,David 在北美和全球一些最大的金融机构担任管理顾问长达 16 年。

相关文章