Nueva publicación

Encontrar

Artículo
· 9 hr atrás Lectura de 9 min

InterSystems IRIS 数据平台架构

InterSystems IRIS 数据平台是所有 InterSystems 应用程序以及医疗保健、金融服务、供应链和其他生态系统中数以千计的客户和合作伙伴应用程序的基础。它是一个融合平台,提供交易分析数据管理、集成互操作性和数据集成,以及集成分析和人工智能。它支持 InterSystems Smart Data Fabric 方法,用于管理多样化的分布式数据。

我们的架构核心是高性能、多模型、多语言数据处理的核心数据引擎,也称为通用数据平面(Common Data Plane)。围绕这个核心,是一个能够扩展极高数据量和极高交易率的出色设施,每秒可处理超过十亿次数据库操作。

接下来是两大子系统:一个专注于分析和人工智能(AI),另一个专注于互操作性和数据集成。这些子系统遵循我们的基本理念,即在数据附近运行所有操作,以提供高性能和最小占用空间。

最后,围绕这些子系统,我们建立了一个智能数据编织(smart data fabric),使客户能够通过单一堆栈解决复杂问题。下文将探讨这些层级及其交互方式,以便更好地了解 InterSystems IRIS 技术的独特之处。

InterSystems技术以其性能著称,其核心是一个高效的数据存储、索引和访问机制。与其他数据库提供商不同,我们不提供原生关系型或文档型数据库。我们使用一种称为globals的底层存储格式。它们以高度优化的多维数组样式格式建模,构建为B+树,并在每次操作时自动索引。在低于数据模型(如关系型、对象型或文档型)的层次上构建,单个存储格式被投影到不同的数据格式和模型中。这被称为通用数据平面(Common Data Plane)

底层global具有很高的效率,可转换为多种不同的数据模型:

Globals(以上标"^"前缀表示)可以有多个下标,每个下标都可以是数字、字母数字或符号。Globals功能强大,以通用方式表示数据,只需一份数据副本就能同时支持多种数据范式。在这种方法中,关联数组和稀疏数组等情况很容易处理。我们还对存储格式本身进行了编码,使用的编码(以美元符号"$"为前缀)由于对磁盘和 I/O 进行了优化,因此占用空间小、延迟低。这些编码的格式在内存、磁盘或线上都是一样的。这最大限度地减少了数据摄取过程中的转换,并达到了内存数据库所能达到的惊人速度,同时还具有磁盘数据库所具有的持久性。

单个global如何支持多种数据模型的示例包括,当您使用SQL或BI工具并希望以关系格式(具有行和列的表)访问数据时。如果您正在进行面向对象的开发,我们会自动将这些对象投射到global中,然后再将这些数据投射到关系格式中。同样,我们也可以将 JSON 或其他文档格式投射到关系格式中。

这种功能意味着,我们不需要拥有多个数据存储,一个关系存储、另一个对象存储和另一个文档存储,也不需要将它们拼接在一起,我们只需将一个副本投射到所有这些不同的形式中,而无需重复、移动或映射。这也是写入模式和读取模式的便捷结合。就像数据湖一样,在插入数据并根据数据的当前用途为其找出最佳模式后,就可以依赖于数据链接等结构层次。这种全局结构既适用于结构化数据,也适用于文档、半结构化或非结构化数据。

为了高效地存储数据和索引,有几种编码设计得非常严密。

虽然列表是默认的存储编码,但 InterSystems IRIS 可以根据数据特性和/或开发人员的规格,用一种或多种编码来表示数据和索引。向量高效地存储大量相同数据类型的数据,可用于分析中的列式存储、向量搜索、时间序列和更特殊的情况。打包值数组(称为 $pva)是面向文档存储的理想选择。位图用于布尔数据和高效位图索引。

所有这些数据结构在每次操作时都会自动编制索引,并进行高度优化的更新。许多成功的客户利用内置索引执行低延迟、全事务性步骤,如前面提到的 "每秒十亿次数据库操作"。这种几乎即时执行的一致索引使我们能够一致、低延迟地访问任何格式的所有数据。由底层global格式实现的多模型功能几乎是即时的,因为只有一份数据需要更改,因此不需要时间或空间进行数据复制。这也带来了在摄入速度、可靠性和扩展性方面的主要优势。

系统可组合编码。由globals提供的多语言能力意味着您可以使用所选的编程语言,轻松访问所有所需格式。通过 JDBC 和 ODBC 等标准进行关系访问显然是如此,在 .NET 或 Java 中自动将对象与底层格式相匹配也是如此。从开发的角度来看,您不需要担心对象的关系映射,只需处理对象,我们会处理存储格式。

在核心数据引擎的周围,还有一个具有内置一致性保证的分布式缓存。该缓存使用我们的企业缓存协议(ECP),满足教科书中对分布式数据和故障下一致性的保证。 ECP内置了这些一致性规则,以在存在故障的情况下维护分布式系统的数据完整性,直接将它们封装在内。

换句话说,即使在大规模情况下,分布式数据的性能也保持高位。您可以扩展这些ECP节点以实现水平扩展,管理更高的吞吐量。您还可以扩展它们以实现数据分布,这意味着您可以在不局限于任何节点可用内存的情况下获得内存性能。

ECP 在云计算中的表现尤为出色,因为它具有扩展能力。我们已将其内置到InterSystems Kubernetes Operator(IKO)中,以提供自动扩展功能,而且我们可以使用 ECP 以透明方式向应用程序添加和移除节点。像这样的扩展基本上是线性的,您可以独立地扩展数据摄取、数据处理和数据存储,并针对您的工作负载进行优化。由于 ECP 对拓扑结构的变化具有鲁棒性,因此节点死亡不会影响事务处理。您可以随时添加节点,它们可以承担负载。这就提供了无缝的弹性,意味着您可以动态调整规模,并享受更低的净成本。ECP 对应用程序是透明的,无需更改即可扩展任何应用程序。客户还可以灵活地将特定工作负载与 InterSystems IRIS 集群中的特定注释集关联起来。例如,可将报告或分析工作负载分配到一个 pod,将事务繁重的工作负载分配到另一个 pod。

InterSystems IRIS 架构的下一层是内置的互操作性子系统。它可以跨消息、设备和不同的应用程序接口集成数据。它还能以 ETL 或 ELT(提取-转换-加载或提取-加载-转换)模式集成批量数据。InterSystems IRIS 互操作性将通用数据平面作为消息处理和数据集成所有要素的内置存储库。这得益于前两层的性能和可靠性以及多模型功能。 例如,批量结构数据往往是面向关系的,而许多消息传递协议往往是面向文档的。

默认情况下,互操作性是持久性的,这意味着数据信息和转换都存储在系统中,以便审计、重放和分析。与许多其他互操作性中间件产品不同的是,交付可以得到保证、跟踪和全面审计。您可以确认信息是否已送达,或查看谁向谁发送了什么信息,这些信息对于分析和取证都非常重要。InterSystems IRIS 互操作性的一般模式是面向对象的,这有助于创建和维护适配器:对象继承最大限度地减少了创建任何所需的自定义适配器(包括测试)所需的工作量。 它还有助于创建和维护数据转换。 如图 8 所示,使用通用对象可显著减少不同数据格式或协议之间所需的转换次数。与为每对数据建立和维护数据转换相比,将每种数据格式转换为一个通用对象的方法更为简单,更易于测试和维护。

在 InterSystems IRIS 互操作性子系统中,有多种跨消息、设备和应用程序接口的集成方案。

这种互操作性包括内置的全生命周期 API 管理、流媒体设施、物联网集成、与云服务的兼容性等。我们还提供多种语言的动态网关,可将现有应用程序以您选择的语言高性能地集成到这些数据流中。

InterSystems IRIS 互操作性与一系列内置分析和人工智能设施并存。

这些功能中的每一种都是 "贴近数据(close to the data)"运行的,也就是说,一般情况下,我们将处理过程带入数据中,而不是以相当高的成本和延迟将数据移至处理过程中。

InterSystems IRIS 内置了多种分析设施。其中一个是InterSystems IRIS BI,它是一种 MOLAP 类型、基于cube的商业智能(BI)架构,针对延迟进行了优化。由于这套子系统内置于 InterSystems IRIS 中,我们可以触发cube中的 SQL 和事件,从数据到仪表盘只需 10-20 毫秒。在事务和分析中使用单一数据副本有助于保持较低的延迟。由于 ECP 允许一组节点在与事务工作负载隔离的情况下对分析进行操作,因此分析不会对事务响应能力造成风险,同时也不需要超过一份的数据副本。

另一项功能是自适应分析(Adaptive Analytics),它与 InterSystems IRIS BI 不同,不使用预构建的cube。它在运行过程中动态优化和构建虚拟cube,使这些cube既可用于 BI,也可用于 Adaptive Analytics。Adaptive Analytics 是一种 ROLAP 类型的无头分析设施,包括与 Tableau、PowerBI、Qlik、Excel 等所有主流 BI 工具的无缝集成。

除分析设施外,还有一些 ML 和 AI 设施。

Integrated ML可让您使用 SQL 编写自动机器学习 (ML) 式模型。您只需编写一条 SQL 命令,然后创建、训练、验证和预测模型。结果可直接在 SQL 中使用。因此,熟悉 SQL 的开发人员可以在他们的应用程序中使用 ML 预测。

Python 直接位于数据平台的内核中,因此可以直接针对数据运行,并获得最高性能。您无需将构建模型的开发或实验室环境移植到运行这些模型的生产环境中。您可以在同一个集群中构建和运行模型,从而确保您构建的模型和运行的模型使用的是相同格式的数据,因此是一致的。数据科学项目简单快捷。

InterSystems IRIS 的嵌入式向量搜索功能可让您搜索非结构化和半结构化数据。数据被转换为向量(或嵌入),然后存储在InterSystems IRIS中并编制索引,用于语义搜索、检索增强生成(RAG)、文本分析、推荐引擎和其他用例。

这些层次——核心数据引擎、用于扩展互操作性的ECP层以及我们的分析设施——是我们能够支持智能数据编织(smart data fabric)架构的独特能力的一部分。Data fabric是一种架构模式,可对各种数据和数据源进行共同管理,其常见模式是从多个来源引入数据;对数据进行规范化、重复数据、交叉关联和改进;然后将其提供给各种不同的应用:

大多数data babric都具有多种功能,包括摄取、管道化、元数据等,使InterSystems方法变得智能的是在data babric中纳入了分析和AI:

InterSystems 技术的关键原则之一是 "连接或收集(connect or collect)"。InterSystems IRIS 中的一些设施,如外来表或联合表,可让您在数据所在的位置进行工作或 "连接 "数据。您也可以选择收集这些数据。

InterSystems IRIS 与云提供商无关,可在企业内部、您选择的云中、异构和混合场景中或多云环境中运行。我们业务中增长最快的部分是我们的云服务,可在多个云中使用。无论您想在哪里部署,都能灵活运行是关键所在。这使InterSystems IRIS有别于云供应商本身提供的设施或当前数据仓库的许多选择。您可以在任何地方运行 InterSystems IRIS 和用它构建的应用程序。当然,InterSystems IRIS 本身也提供云管理服务。

更多相关文章:

资料来源:InterSystems IRIS 数据平台:架构指南

Comentarios (0)1
Inicie sesión o regístrese para continuar
InterSystems Official
· 9 hr atrás

IPM 0.10.5 版发布说明

IPM 0.10.5 版已于 2026 年 1 月 15 日发布。新版本包含大量改进和错误修复,请务必直接从GitHub 页面或社区注册中心查看!

主要变化如下

  • 重写了依赖关系解析,大大提高了性能,包括在非常复杂的情况下速度提高了 200 倍
  • 跟踪 IPM 安装、加载、更新和卸载的历史日志,可使用zpm "log "查看
  • 系统表达式(如${namespace} 和 $$$ 宏)现在可在 CPF 合并文件中进行评估,使初始配置更具灵活性
  • 模块.xml 中的 <Invoke> 将更直观地表现为始终检查 %Status 返回值,前提是且仅当方法签名声明返回 %Status。这意味着如果没有返回任何值、返回值不是 %Status 或不是 $$$OK,就会产生错误。

以下是完整的变更列表:

已添加

  • #938:为软件包命令添加了 -export-python-deps 标志
  • #462:用于版本库配置的 repo 命令现在支持使用 -password-stdin 标志的密码秘密输入终端模式。
  • #935:添加通用的 JFrog Artifactory tarball 资源处理器,用于将工件与软件包捆绑,并在安装时部署到最终位置。
  • #950:新增使用 list -pythonlist -pylist-installed -python 列出已安装 Python 软件包的支持。
  • #822:CPF 资源处理器现在支持 CPF 合并文件中的系统表达式和宏
  • #578:添加了记录和显示 IPM 安装、卸载、加载和更新历史的功能
  • #961:增加了在安装时使用 -create-lockfile 标志为模块创建锁定文件的功能。
  • #959:在 ORAS 仓库中,外部名称现在可以与 installupdate 的(默认)名称互换使用,即使用(默认)名称发布的模块可以使用其外部名称安装。
  • #951:如果提供 -force 标志,unpublish 命令将跳过用户确认提示。
  • #1018:不使用 -all 标志时,卸载时需要模块名称

已更改

  • #316:loadinstallupdate 命令中包含的所有参数(开发人员模式除外)都将传播给依赖程序
  • #885:始终同步加载依赖项,并让每个模块根据需要使用多线程编译来加载,而不是试图绕过 IRIS 编译器对项目加载进行多线程编译,从而导致锁争用。
  • #481:通过以下方法提高 BuildDependencyGraph 的性能:
    • 消除递归并使用迭代。
    • 取消深度优先搜索,采用纯广度优先搜索。
    • 通过折叠搜索表达式(减少交叉表达式),更好地缓存模块搜索结果。

已删除

  • #938:删除了 %Publish() 中对秘密标志 NewVersion 的处理

已修复

  • #943:当 load 命令与 GitHub 仓库 URL 一起使用时,会再次接受 branch 参数。
  • #701:修正了关于 search 命令的误导性帮助注释
  • #958:如果使用外部名称,更新命令不应提前失败
  • #970: 修复:解决 "生成 "命令 WebApp 处理中的错误
  • #965:在名称不带斜线的目录上进行文件复制(FileCopy)现在可以正常工作了
  • #937:发布包含 <WebApplication> 的模块不再出错
  • #957:改进了操作系统命令执行的错误信息。现在,当命令执行失败时,错误信息会包含完整命令及其返回代码。还修正了 Windows attrib 命令的参数分离,并删除了对丢失命令的误导性错误处理。
  • #789:修复在为 ORAS 软件包列出指定命名空间的模块时出现的错误。
  • #999、#1000:安装 IPM 时清除旧版本 IPM 中使用的陈旧映射
  • #1007:${ipmDir} 表达式现在可在 <Arg><Invoke> 中使用。
  • #1015:修复 * 作为版本要求和相交范围无法正常工作的依赖关系解析错误。
  • #1036:update 命令不再将开发者模式传播给依赖关系

已弃用

  • #828:用于 <Invoke> 操作的 CheckStatus 标志已被弃用。现在的默认行为是,如果且仅当方法签名返回 %Library.Status 时,始终检查该方法的状态。
  • #885:-synchronous 标志,因为同步加载依赖关系现在是默认行为。

安全性

  • urllib3 轮已更新至 2.6.3

如果您有任何问题、建议或要提出的 bug,请随时在此处或GitHub 页面上提出。(在 GitHub 上,问题和建议应放在讨论页面,而错误应放在问题页面)。

Comentarios (0)1
Inicie sesión o regístrese para continuar
Artículo
· 10 hr atrás Lectura de 5 min

プロセスを一定間隔またはスケジュールで実行する方法

InterSystems IRIS、特にInteroperabilityを使い始めたころ、最初によく思っていた疑問の一つは「処理を一定間隔やスケジュールで実行するにはどうすればいいのか」でした。 このトピックでは、この問題に対処する2つのシンプルなクラスをご紹介します。 似たようなクラスがEnsLibに見当たらないことに、驚いています。 十分に検索しなかったのかもしれません。 いずれにせよ、このトピックでは複雑な作業を扱うつもりはなく、初心者向けの簡単なスニペットを少し紹介します。

Comentarios (0)0
Inicie sesión o regístrese para continuar
Artículo
· 13 hr atrás Lectura de 6 min

分表(Sub-Table)安全

InterSystems IRIS 提供广泛的可配置安全选项,但许多开发人员主要使用角色和资源来保护整个表或例程。今天,我们将深入探讨。我们也可以分别确保单个列和行的安全,但这两种机制的操作方式截然不同。让我们从列开始。

列安全

为便于测试和演示,我们将保持表结构简洁明了。我们在 USER 名称空间中有一个名为 "Person "的表,其中包含 ID 列、出生日期列 (DOB)、名和姓。

Class User.Person Extends %Persistent
{
    Property FirstName As %String;
    Property LastName As %String;
    Property DOB As %Date;
    Property User As %String;
}

我们将创建一个名为 limited_access 的角色,它将实现一些列的安全性,但我们必须记住的第一件事是确保将 %DB_User 资源添加到该角色,以便用户可以访问数据库。完成这些后,我们就可以开始考虑列的问题了。我们将进入角色设置中的 SQL 表选项卡,确保选择了 USER 命名空间。然后单击 "添加表(Add Tables)"按钮右侧的 "添加列(Add Columns)"按钮。这将打开我们控制列权限的对话框。

该界面与添加表权限的界面非常相似。值得注意的是 "删除(DELETE  ) "选项不在其中,因为它不能在列级别进行控制。这是有道理的,因为我们无法删除表中记录的单个列。不过,我们可以保留对 SELECT、INSERT、UPDATE 和 REFERENCES 权限的控制。我们还可以使用 "授予管理员(Grant Admin)"复选框,允许具有该角色的用户将相同的权限委托给其他用户或角色。在今天的示例中,我们将授予该角色 ID、FirstName 和 LastName 列的所有权限。但是,我们将只为 DOB 列分配 SELECT 权限。完成这些更改后,我们将保存角色。这时你会发现,角色配置中该表的条目在权限列下显示了一个连字符 (-)。不过,它还包含一个 "编辑列(Edit Column )"选项。

如果我们点击右侧的 "编辑列(Edit Column)"链接,就可以查看为每一列单独定义的确切权限。

在这里,我们可以修改或撤销特定列的权限。如果选中 "添加列(Add Column) "复选框,添加列的初始配置表单将重新出现在下方,允许我们进一步添加。如果遇到角色中列出的表格似乎缺乏已定义的权限,则应单击 "编辑列(Edit Column)"链接,检查特定列的权限。

为了测试此配置,我们需要设置一个具有此角色的用户。我们将这个用户命名为 testuser。它将拥有我们的 limited_access 角色,我们还将授予它 %Developer 角色,以访问管理门户的 SQL 部分并执行一些查询。例如,请看下面的 SQL 查询。

INSERT INTO Person(DOB,FirstName,LastName) VALUES(%ODBCIN('1900-09-03'),'David','Hockenbroch')

如果我们以具有 %All 权限的超级用户身份登录并执行此查询,查询将会成功。但是,如果我们注销管理门户并以测试用户身份重新登录,则会出现错误。

查询失败的原因是用户没有权限插入 DOB 列。如果我们调整查询,省略受限列,查询就会成功。下面的查询对该用户仍然有效:

INSERT INTO Person(FirstName,LastName) VALUES('David','Hockenbroch')

同样,如果用户没有更新或选择列的权限,任何违反这些限制的查询都会失败。例如,如果我从列权限中完全删除了 DOB 列,就无法执行 SELECT * FROM Person 命令。相反,我必须使用 SELECT ID、FirstName、LastName FROM Person 命令。请注意,如果用户无法访问某些计算列,计算仍会正确执行。

如果我们稍微修改一下类的定义,就会引入一个全新的问题。假设我们决定修改类定义,在 DOB 属性中包含 Required 关键字。如果我们尝试运行上述查询,就会导致错误,而不是成功。

在建立列权限时,您必须牢记这一点:如果您拒绝给予用户某一列的 INSERT 权限,而该列又不是通过计算代码、初始表达式或类似方法自动分配的,那么该用户将根本无法插入任何记录!

行级安全

现在,我们将探讨行级安全性。我们的目标是确保只有创建行的用户才能访问该行。

行级安全性的功能与列级安全性截然不同。我们不能通过管理门户( Management Portal)配置它。相反,我们必须修改我们的类定义。首先,我们应该添加一个属性:

Property Creator As %String [ SqlComputeCode = {set {*} = $USERNAME}, SqlComputed, SqlComputeOnChange = %%INSERT];

这是一个 SQL 计算属性,在插入记录时会自动将其值设置为当前用户名。我们将为每个用户插入一条记录。然后,我们应该观察以下记录:

接下来,我们需要覆盖类定义中的 ROWLEVELSECURITY 参数。将其设置为 1 将自动引导 IRIS 将读者列表存储在名为 %READERLIST 的属性中。不过,在我们的例子中,由于我们创建了一个属性来存储有权访问该行的用户名,因此我们将用该列的名称(Creator)覆盖该参数。请记住,由于行级安全性可以通过角色或用户名来处理,因此如果需要,我们可以使用包含角色名称的列来代替。

如果此时我们试图从表中选择任何数据,查询将返回空值。出现这种情况是因为我们在现有表中添加了行级安全性,而行级安全性依赖于在用于安全性的字段上建立索引。现在我们必须重建表的索引。我们将通过管理门户完成这项工作。在 SQL 区域,我们将选择左侧的表,然后单击操作,最后单击重建表的索引。

现在有了适当的索引,当用户从表中选择时,他们将只看到自己的行。必须认识到,这一限制甚至适用于超级用户!在 IRIS 的大多数安全环境中,拥有 %All 角色的用户几乎可以访问所有内容,但行级别的安全是一个明显的例外。即使我们以超级用户身份运行 DELETE * FROM Person 查询,也只能删除超级用户有权访问的记录。

我们可以用另一种方法实现同样的结果。这次,我们将 ROWLEVELSECURITY 参数设置为 1,但在类中添加一个 %SecurityPolicy 方法。

ClassMethod %SecurityPolicy(Creator) As %String [ SqlProc ]
{
    return Creator
}

该方法被定义为返回字符串并使用 SqlProc 关键字的类方法。它可以接受任意数量的参数,但这些参数必须是类本身的列名,而且参数的名称必须与列名精确匹配。在本例中,由于我们处理的列名为 "Creator",因此方法参数也必须名为 "Creator"。我们只需返回该列的值即可实现我们的目标。只要最终返回的是用户名或角色名,该方法就可以根据需要变得复杂。如有必要,它也可以返回以逗号分隔的名称列表。

当 ROWLEVELSECURITY 参数设置为 1 时,%READERLIST 属性将用于存储谁有权访问该行。如果希望在查询中查看该列表,可以执行类似下面的操作。

SELECT %READERLIST, * FROM Person

除表安全性外,还执行行级安全性。除非用户同时拥有表和行的权限,否则无法访问、更新或删除行。重要的是,行级安全仅在使用 SQL 时适用,而不是在使用对象访问或直接操作全局时。如果以绕过此安全层的方式访问数据,请务必谨慎!

认真使用这两个强大的工具,可以大大提高数据安全性!

Comentarios (0)1
Inicie sesión o regístrese para continuar
Comentarios (0)0
Inicie sesión o regístrese para continuar