如何使用 Java 可观察性进行有效编码
无论您是经验丰富的开发人员、还是数据库管理员、亦或 NoSQL 数据库的爱好者,可能已经注意到,在如今快速发展的企业架构格局中,MongoDB 和 Couchbase 已成为 NoSQL 数据库的两大典型竞品。
本文将通过展示在真实企业架构中使用 MongoDB 和 Couchbase 的 Java 示例,和您一起探索两者之间的关键差异,各自独有的优势和不足,以及如何在它们之间快速切换,以确保无缝地适应项目的动态需求。
01.NoSQL 文档数据库
让我们首先对 NoSQL 文档数据库,以及基本的存储和检索原理有所理解。NoSQL 数据库采用灵活的模式和 JSON/BSON 文档格式,以适应不断变化数据的需求。NoSQL 数据库,也被称为“Not Only SQL”,旨在解决传统关系数据库的局限性。与具有固定模式的结构化表的关系数据库不同,NoSQL 数据库提供了一个灵活的无模式(schema-less)数据模型。在 NoSQL 类别中,文档数据库直接在文档中存储和检索数据。如下图所示,它们通常表现为类似 JSON 的对象或 BSON(Binary JSON)文档。通过嵌套结构,这些文档能够高度适应不断变化的数据需求。
02.Couchbase 定义
作为领先的 NoSQL 文档数据库,Couchbase 在性能、可扩展性和可用性方面非常出色。它结合了分布式键值存储和面向文档的数据库功能,能够在多个节点和数据中心之间提供无缝的水平扩展。凭借其强大的一致性模型,Couchbase 可以处理具有低延迟和高吞吐量需求的大规模应用。同时,它也能够提供强大的移动和边缘计算支持,并已成为了需要横跨不同设备进行数据同步的应用项目的理想选择。
03.Couchbase 的优势
高性能:Couchbase 的分布式架构和内存优先的存储引擎,可以提供卓越的性能。即使在重负载下,它也能确保低延迟的数据访问。其高效的缓存机制优化了读写操作,可以为高吞吐量应用实现无缝的扩展。
可扩展性:Couchbase 的自动分片和多维扩展功能,可以轻松地实现水平扩展。它能够在多个节点和集群之间快速扩展,并在不影响性能的情况下,满足不断增长的数据和用户需求。
强大的一致性:带有多维扩展(Multi-Dimensional Scaling,MDS)的 Couchbase 带有强大的一致性,提供了关键应用所需的 ACID 属性,并确保了适用于关键任务用例的数据完整性和可靠性。
内置的全文搜索:Couchbase 集成了强大的全文搜索引擎,使得开发人员能够快速地对非结构化数据执行复杂的搜索与查询。该内置功能不但简化了开发,而且增强了应用的搜索能力。
移动和边缘计算支持:由 Couchbase 提供的 Couchbase Lite,是一个专为移动和边缘计算设计的嵌入式 NoSQL 数据库。它通过横跨设备的无缝数据同步,实现了离线访问和实时更新,并已成为了移动应用和物联网用例的理想选择。
04.MongoDB 定义
作为另一款著名的 NoSQL 文档数据库,MongoDB 以其易用性、灵活性和强大的查询功能而广受欢迎。它能够将数据存储到类似 JSON 的 BSON 文档中,并提供动态的进化模式。MongoDB 的设计非常适合敏捷开发。开发人员能够通过快速迭代,来适应不断变化的应用需求。凭借着水平扩展功能,以及丰富的工具和库生态系统,MongoDB 已成为了从 Web 应用到大数据实时分析等用例的热门选择。
05.MongoDB 的优势
灵活的模式:MongoDB 的无模式设计,允许开发人员实时地调整数据结构,促进敏捷开发,以适应不断变化的应用需求,且无需迁移数据库模式。
水平可扩展性:MongoDB 对于水平扩展和自动分片的原生支持,使得应用能够毫不费力地处理大量数据、以及并发的用户请求。随着用户群的扩大,它能够确保应用的无缝增长。
丰富的查询语言:MongoDB 查询语言(MQL)提供了一种灵活且富有表现力的方式,来检索和操作数据。凭借针对复杂查询和强聚合管道的支持,开发人员可以根据自己的需求去定制响应。
复制和高可用性:MongoDB 的副本集架构确保了横跨多个节点的自动数据复制,并保证了数据的冗余和高可用性。在主节点出现故障时,辅助节点可以迅速接管,并最大限度地减少宕机时间。
敏捷开发:MongoDB 的易用性、直观的 API、以及简单的设置,都促进了快速原型和开发周期。开发人员可以快速地通过迭代和测试,来缩短新功能和应用的面市时间。
06.Couchbase 和 MongoDB 之间的共同点
总的说来,Couchbase 和 MongoDB 都有着如下核心功能和属性:
文档存储:两种数据库都能够将数据存储在灵活、无模式的文档中,并支持直接的数据表示和操作。
水平可扩展性:它们都允许应用在多个节点上分发数据,并确保高可用性和容错性。
分布式架构:两种数据库都可以在分布式环境中运行,并提供跨集群的无缝数据复制和分发。
JSON/BSON 支持:两者都使用类似 JSON 的 BSON 文档,作为其主要的数据格式,以确保与现代应用架构的兼容性。
丰富的查询功能:它们提供了强大的查询语言,实现了高效的检索和数据操作。
下面,让我们来探讨一下每个数据库的不足:
07.Couchbase 的不足
复杂性:设置和配置 Couchbase 集群可能会比 MongoDB 更加复杂,特别是在大规模部署过程中。
学习曲线:由于附带有各种高级功能和概念,因此 Couchbase 的新手开发人员可能会面临更加陡峭的学习曲线。
社区和生态系统:虽然 Couchbase 有一个不断增长的社区和生态系统,但是它目前尚不及 MongoDB 那么广泛,因此导致了资源和社区驱动型解决方案会少一些。
08.MongoDB 的不足
数据一致性:MongoDB 的默认一致性模型,可能不适合那些需要强一致性的应用,因此需要事先仔细设计和考虑。
联合操作:MongoDB 缺乏对于传统 SQL 的支持,这会导致规范化复杂数据和应用端处理的增加。
内存使用率:MongoDB 的内存使用率相对比较高,特别是在处理大量索引或数据集时,这可能会影响到整体性能。
如何在 Couchbase 和 MongoDB 之间进行选择,主要取决于具体的项目要求、现有的技术堆栈,以及对于一致性、可扩展性和易用性的需求。下面的表格对比了两种数据库的特点,可方便架构师和开发人员根据其应用的独特需求、以及性能目标,做出明智的决策。
09.真实应用场景比较
下面,我将通过在真实的 Java 企业应用场景中,使用 Couchbase、MongoDB、以及 Jakarta NoSQL 规范,来讨论两种数据库如何通过其独特的功能,来执行查询,管理一致性,以及处理聚合。我们将创建一个啤酒工厂应用,来高效地管理啤酒送货地址和用户信息。该应用将在 Open Liberty 服务器上运行,并能够与Jakarta EE 10或Eclipse MicroProfile 6相兼容。
首先,我们将使用 Jakarta EE Starter 或 Eclipse MicroProfile Starter 来创建项目,然后添加所需的依赖项。有了 Jakarta NoSQL 的广泛数据库支持,我们可以通过下列代码段,将 Couchbase 和 MongoDB 添加到 Maven 依赖列表中。
设置好依赖项后,我们将在 microprofile-config.properties 文件中配置凭据。此外,我们将使用系统环境配置,去覆盖Eclipse MicroProfile的配置。当类路径(classpath)中存在多个选项时,jnosql.document.provider 键将确保我们选择合适的文档提供程序。请参见如下代码段:
该应用的核心在于实体创建,我们在其中定义了 Beer 实体,以及嵌套式 Address 的子文档结构。
在实体准备就绪后,我们将使用Template和DocumentTemplate在 Java 应用和数据库之间建立通信。利用 Jakarta Data 的存储库界面上,我们将实现有效的数据库交互,并在 Beer 实体上执行 CRUD 操作。
10.MongoDB 的配置和运行
配置完这两种数据库后,我们将为该项目设置 MongoDB 和 Couchbase。对于 MongoDB 而言,为了简单起见,我们可以使用如下命令来调用单个 Docker 容器:
接着,我们通过注释 Couchbase 行和取消注释 MongoDB 行,来修改属性文件,以将 MongoDB 设置为 provider:
设置好 MongoDB 后,我们后续便可以按需使用它了。
11.Couchbase 的配置和运行
我们遵循类似的方法,转移到 Couchbase 上,并使用如下命令创建单个 Docker 容器,以进行测试:
鉴于 Couchbase 需要更多的配置,您可以通过浏览器访问其用户界面(UI),以轻松地定义各种所需的参数:
访问 http://localhost:8091/ui/index.html。
选择 Setup New Cluster。
将 root 定义为管理员用户名。
将 123456 定义为密码。
将 localhost 设置为集群名称。
接受条款和条件。
导航到 Buckets 会话。
使用“Add Bucket(添加桶)”选项创建一个名为 beers 的桶。
点击 beers,将 Hero 和 Villain 添加为 collections(收藏)。
转到 Query(查询)会话并执行:CREATE PRIMARY INDEX `#primary` ON `factory`.`_default`.`beer`。
在具体配置中,我们需要利用如下代码执行与前面相反的操作:
一旦 MongoDB 和 Couchbase 准备就绪,我们便可以利用 Jakarta NoSQL 的功能,以及 Java 与这两种 NoSQL 数据库的无缝交互,来开发啤酒工厂应用了。
12.使用 API
我们基于上述数据库的相关定义和设置,使用如下 Maven 命令来构建项目:
并使用如下 Maven 命令来运行应用:
我们可以使用任何 HTTP 客户端(在此,我们将使用 curl),来测试应用运行情况。
我们使用如下命令,来生成啤酒的随机数据:
使用如下命令获取所有的啤酒信息:
通过如下命令,我们根据特定请求(例如,啤酒“Magnum”或麦芽“Vienna”)来过滤啤酒:
通过执行上述命令,我们可以测试在企业应用开发中,不同 NoSQL 数据库的能力与效率。
13.小结
综上所述,我们体验了在 Jakarta EE 生态系统中,使用 NoSQL 数据库轻松实现标准化注释、API 和 Jakarta 数据存储库的简单开发过程。可以说,Jakarta NoSQL 促进了 MongoDB 和 Couchbase 之间的无缝切换能力,使得我们能够根据项目的实际要求,在两种数据库之间轻松地转换,并通过一些简单的配置更改,以获取两种数据库各自的最佳性能和可扩展性,进而实现了与应用的流畅交互。
14.开发界的强者
JNPF,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。
低代码是将开发过程中某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。因而极大的提高了程序员的生产效率。
官网:www.jnpfsoft.com/?infoq ,如果你有闲暇时间,可以做个知识拓展。
它是一款基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。
为了支撑更高技术要求的应用开发,从数据库建模、Web API 构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动。
版权声明: 本文为 InfoQ 作者【这我可不懂】的原创文章。
原文链接:【http://xie.infoq.cn/article/7b611fa3de172a2218cb769e4】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论