各位社区成员,大家好!
我们想念 Global Masters,相信你们也是!
🚀 Global Masters 将于 2024 年 10 月 3 日再次启动!

各位社区成员,大家好!
我们想念 Global Masters,相信你们也是!
🚀 Global Masters 将于 2024 年 10 月 3 日再次启动!

IRIS 支持 WS-ReliableMessaging 规范的部分内容,如简介中所述。此规范提供了一种按顺序可靠地传递一系列消息的机制。本页介绍如何手动使用可靠消息传递。
Web 客户端发送一系列消息要将一系列消息从 IRIS Web 客户端可靠地发送到支持 WS-ReliableMessaging 的 Web 服务,请执行以下操作:
Web 客户端的安全标头元素。如果正在使用 WS-SecureConversation,请启动安全对话。
%SOAP.RM.CreateSequence的 Create() 类方法。这将返回该类的一个实例。此方法具有以下签名:
classmethod Create(addressingNamespace As %String,
oneWay As %Boolean = 0,
retryInterval As %Float = 1.0,
maxRetryCount As %Integer = 8,
expires As %xsd.在使用FHIR进行开发的过程中,我们会面对海量的FHIR规范中定义的数据结构,具体来说在FHIR规范中定义了超过150个资源、700多个资源内元素。每个定义里都包括了对自身结构的描述以及数据约束、数据绑定值集等。对于一个开发人员要记住这些内容非常困难。
同时FHIR数据,特别是Json格式的FHIR数据是典型的“有向图”结构,它的资源中嵌套元素定义、集合以及复杂的资源间“关系”,在这些复杂结构的数据间导航并操作,非常困难。
.png)
在InterSystems IRIS for Health 2024.1之前,我们会将FHIR数据以Json文档的方式载入 %DynamicAbstractObject,例如下面的代码
set dynObject1 = ##class(%DynamicObject).%New()
set dynObject1.SomeNumber = 42
set dynObject1.SomeString = "a string"
set dynObject1.SomeArray = ##class(%DynamicArray).%New()
set dynObject1.SomeArray."0" = "an array element"
set dynObject1.SomeArray.我们最近在向量搜索抢险体验计划中提供了新版的 InterSystems IRIS,新版本采用了新的基于分层可导航小世界 (HNSW) 索引算法的近似最近邻索引。 这一新增功能可对大型向量数据集进行高效的近似最近邻搜索,从而显著提高查询性能和可扩缩性。
HNSW 算法旨在通过构建基于图形的结构来优化高维数据的向量搜索,从而更快地在大型向量集合中找到近似邻。 无论您使用的是推荐系统、自然语言处理,还是其他机器学习应用,HNSW 都能显著缩短搜索时间,同时允许您调整准确度水平,但准确度提高的代价是查询时间变慢。
HNSW 的主要优点包括:
• 即使数据集规模不断扩大,也能加快搜索速度
• 减少内存占用,同时保持高准确度
• 与现有的 IRIS 向量搜索功能无缝集成
最新版本现已通过向量搜索抢先体验计划提供。 要参与,请在此处注册,下载新版本并开始测试。 我们正在持续增强向量搜索的功能,因此您的反馈至关重要!
我们鼓励您探索性能改进方法,并与社区分享您的想法。 如果您在抢先体验阶段遇到任何问题或有任何反馈,请联系我。
祝您编码愉快!
在 Web 服务使用 <SecurityContextToken>, 做出响应后,客户端实例和服务实例可以访问相同的对称密钥。有关此密钥的信息包含在两个实例的 SecurityContextToken 属性中。建议的程序如下:
SecurityOut 属性设置为 null,以删除请求消息中使用的安全标头。在 Web 服务中不需要这样做,因为 Web 服务会在每次调用后自动清除安全标头。
<SecurityContextToken> 添加到 WS-Security 标头元素。为此,请调用 Web 客户端或 Web 服务的 SecurityOut 属性的 AddSecurityElement() 方法。例如: set SCT=..SecurityContextToken
do ..SecurityOut.AddSecurityElement(SCT)
如果在下一步创建派生密钥令牌时使用 $$$SOAPWSReferenceSCT 引用选项,则此步骤是必需的。否则,此步骤不是必需的。
<SecurityContextToken>创建一个新的 <DerivedKeyToken> 。为此,调用 %SOAP.IRIS Web 服务以支持 WS-SecureConversation当 Web 客户端向 Web 服务发送请求安全对话的消息时,安全对话就开始了。作为响应,Web 服务发送双方都可以使用的 <SecurityContextToken>。
要使 IRIS Web 服务能够使用此令牌进行响应,请重写 Web 服务的 OnStartSecureConversation() 方法。此方法具有以下签名:
Method OnStartSecureConversation(RST As %SOAP.WST.RequestSecurityToken) As
%SOAP.WST.RequestSecurityTokenResponseCollection
该方法应该执行以下操作:
SOAP 主体。OnStartSecureConversation() 发送的消息包含必须保护的信息;此信息在 SOAP 主体中携带。根据需要,可以选择采用其他方式保护消息安全。
%SOAP.WST.Entropy 的 CreateBinarySecret() 方法。此方法返回表示随机服务器熵的该类的实例。IRIS 支持安全对话,遵循 WS-SecureConversation 1.3 规范。本页介绍如何手动创建安全对话。
在安全对话中,Web 客户端向 Web 服务发出初始请求并接收包含 <SecurityContextToken> 的消息。此元素包含双方都可以使用的对称密钥的信息。此信息指的是只有双方知道的共享密钥。然后双方可以在后续交换中使用对称密钥,直到令牌过期或客户端取消令牌。
双方不应该直接使用 <SecurityContextToken> 执行这些任务(不推荐),而应该从中生成一个 <SecurityContextToken>,然后使用它进行加密、签名、解密和签名验证。
共享密钥可以通过以下任一方式指定:
Web 客户端启动安全对话。要在 IRIS 中执行此操作,请在 Web 客户端中执行以下操作:
SOAP 主体。客户端发送的请求包含必须保护的信息;此信息在 SOAP 主体中携带。根据需要,可以选择采用其他方式保护请求消息。
%SOAP.WST.Entropy的 CreateBinarySecret() 方法。此方法返回表示随机客户端熵的该类的实例。WS-Security了解 IRIS 网络服务有两个独立的机制在起作用是很有用的:IRIS 服务器和网络服务代码。
Web 应用程序指定允许的身份验证模式,从而控制对 %Service_WebGateway 服务的访问。(有关详细信息,请参阅时间戳和用户名令牌示例。有关更多背景信息,请参阅 Web 应用程序。)如果您选择密码选项,则 Web 应用程序可以接受 IRIS 用户名/密码对;这称为实例身份验证。Web 服务还可以要求 IRIS 用户名/密码对。这些机制协同工作如下:
Web 服务将检查是否存在名为 <Security> 的标头元素,而不会检查该元素的内容。<Security>标头元素并且 SECURITYIN 参数等于 REQUIRE,则 Web 服务将发出故障并退出。<Security> 标头元素包含<UsernameToken> 元素:Web 应用程序选择了密码选项,则 Web 服务将读取 <UsernameToken>元素,从中获取用户名和密码,并登录到 Web 应用程序。Web 服务对 SECURITYIN 参数的任何值(IGNOREALL 除外)都执行此操作。
✓ 九月有 47 位新成员加入
✓ 所有时间发布了 2,208 篇帖子
✓ 所有时间有 2,024 位成员加入
本主题介绍如何验证 IRIS Web 服务或 Web 客户端收到的消息中的安全元素(并自动解密任何加密内容)。
IRIS 网络服务和网络客户端可以验证入站 SOAP 消息的 WS-Security 标头元素,以及自动解密入站消息。
IRIS Web 服务和 Web 客户端还可以处理已签名的 SAML 断言令牌并验证其签名。但是,验证 SAML 断言的详细信息是您的应用程序的责任。
如果使用安全策略,所有上述活动都是自动的。
在所有场景中,IRIS 都使用其根颁发机构证书集合;请参阅设置和其他常见活动。
WS-Security 标头要验证任何入站 SOAP 消息中包含的 WS-Security 标头元素,请执行以下操作:
Web 服务或 Web 客户端中,设置 SECURITYIN 参数。使用以下值之一:
REQUIRE — Web 服务或 Web 客户端验证 WS-Security 标头元素,如果不匹配或缺少此元素,则会发出错误。ALLOW — Web 服务或 Web 客户端验证 WS-Security 标头元素。签名然后加密(使用对称密钥时):
<DerivedKeyToken> 进行加密中的步骤进行操作。<DerivedKeyToken> 进行签名中的步骤进行操作。以下示例使用对称密钥进行签名和加密。它使用消息接收者的公钥创建一个 <EncryptedKey>元素,然后使用该元素生成两个 <DerivedKeyToken> 元素,一个用于签名,一个用于加密:
// create UsernameToken
set userToken=##class(%SOAP.Security.UsernameToken).Create("_SYSTEM","SYS")
//get credentials of message recipient
set x509alias = "servernopassword"
set cred = ##class(%SYS.X509Credentials).GetByAlias(x509alias)
//get EncryptedKey element
set enc=##class(%XML.Security.EncryptedKey).可以在同一条消息中加密和签名。在大多数情况下,只需组合前面主题中给出的方法即可。本主题讨论了多种场景。
要签名然后加密(使用非对称密钥时),请执行以下操作:
或者按照加密 SOAP 主体中的步骤进行操作。
要仅加密 SOAP 主体,然后添加数字签名(使用非对称密钥时),请执行以下操作:
要加密任何安全标头元素,然后添加数字签名(使用非对称密钥时),必须使用顶级 <ReferenceList> 元素(在文档的其他地方不需要)。在这种情况下,请执行以下操作:
1 — 4 进行操作。<EncryptedData> 元素。为此,请调用 %XML.Security.EncryptedData的 Create() 类方法。在此过程中,指定所有三个参数:a. 在前面的步骤中创建的加密密钥实例。
b. 要加密的安全标头元素。
c. $$$SOAPWSReferenceEncryptedKey,指定 <EncryptedData> 如何使用加密密钥实例。
欢迎来到我的 CI/CD 系列的下一个章节,我们将探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。
今天,我们来谈谈互操作性。
当您有一个有效的互操作性生产时,您有两个独立的流程:一个是处理消息的可以正常运行的生产流程,另一个是更新代码、生产配置和系统默认设置的 CI/CD 流程。
显然,CI/CD 流程会影响互操作性。 但问题是:
经过将近四年的停顿,我的 CI/CD 系列又回来了! 这些年来,我与多个 InterSystems 客户合作,为不同的用例开发 CI/CD 管道。 希望本文中提供的信息对您有所帮助。
此系列文章探讨了使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。
我们有一系列激动人心的话题要讨论:但今天,我们来谈谈代码之外的事情 – 配置和数据。
之前我们探讨过代码提升,这在某种程度上是无状态的 – 我们总是从一个(大概)空实例到完整的代码库。 但有时,我们需要提供数据或状态。 不同的数据类型包括:
我们来探讨所有这些数据类型,以及如何先将它们提交到源代码控制工具中,然后进行部署。
系统配置分布在许多不同的类中,但 InterSystems IRIS 可以将大多数类导出为 XML。 首先是一个安全软件包,其中包含以下信息:
所有这些类都提供 Exists、Export 和 Import 方法,允许您在不同的环境之间移动它们。
一些注意事项:
在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:
在本文中,我们将讨论如何构建并部署您自己的容器。
在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:
在本文中,我们将使用 InterSystems Cloud Manager 构建持续交付。 ICM 是一个面向基于 InterSystems IRIS 的应用程序的云配置和部署解决方案。 它允许您定义所需部署配置,ICM 会自动提供这些配置。 有关详情,请参阅 ICM 概述。
在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:
在第一篇文章中,我们介绍了 Git 基础知识、深度理解 Git 概念对现代软件开发至关重要的原因,以及如何使用 Git 开发软件。
在第二篇文章中,我们介绍了 GitLab 工作流 – 一个完整的软件生命周期流程,并介绍了持续交付。
在第三篇文章中,我们介绍了 GitLab 安装和配置以及将环境连接到 GitLab
在第四篇文章中,我们编写了 CD 配置。
在第五篇文章中,我们讨论了容器以及使用容器的方式(和原因)。
在第六篇文章中,我们将探讨运行包含容器的持续交付管道所需的主要组件以及这些组件如何协同运行。
在这篇文章中,我们将构建上一篇文章中探讨的持续交付配置。
在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:
在第一篇文章中,我们介绍了 Git 基础知识,以及为什么对 Git 概念的高层次理解对于现代软件开发如此重要,以及如何使用 Git 开发软件。
在第二篇文章中,我们介绍了 GitLab 工作流 – 一个完整的软件生命周期流程和持续交付。
在第三篇文章中,我们介绍了 GitLab 的安装和配置以及如何将环境连接到 GitLab。
在第四篇文章中,我们编写了 CD 配置。
在 第五篇文章中,我们讨论了容器与如何(以及为什么)使用它们。
在本文中,我们将探讨运行使用容器的持续交付管道所需的主要组件,以及它们如何协同工作。
在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:
在第一篇文章中,我们介绍了 Git 基础知识、深度理解 Git 概念对现代软件开发至关重要的原因,以及如何使用 Git 开发软件。
在第二篇文章中,我们介绍了 GitLab 工作流 – 一个完整的软件生命周期流程,并介绍了持续交付。
在第三篇文章中,我们介绍了 GitLab 安装和配置以及将环境连接到 GitLab
在第四篇文章中,我们编写了 CD 配置。
在这篇文章中,我们将介绍容器以及使用容器的方法(和原因)。
在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:
在第一篇文章中,我们介绍了 Git 基础知识、深度理解 Git 概念对现代软件开发至关重要的原因,以及如何使用 Git 开发软件。
在第二篇文章中,我们介绍了 GitLab 工作流 – 一个完整的软件生命周期流程,并介绍了持续交付。
在第三篇文章中,我们介绍了 GitLab 安装和配置以及将环境连接到 GitLab
在这篇文章中,我们将介绍编写 CD 配置。
首先,我们需要多个环境以及与之对应的分支:
| 环境 | 分支 | 交付 | 有权提交的角色 | 有权合并的角色 |
|---|---|---|---|---|
| 测试 | master | 自动 | 开发者、所有者 | 开发者、所有者 |
| 预生产 | preprod | 自动 | 无 | 所有者 |
| 生产 | prod | 半自动(按下按钮进行交付) | 无 |
所有者 |
作为示例,我们将使用 GitLab 流程开发一个新功能,并使用 GitLab CD 进行交付。
在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:
在上一篇文章中,我们介绍了 Git 基础知识、深度理解 Git 概念对现代软件开发至关重要的原因,以及如何使用 Git 开发软件。 我们的侧重点仍是软件开发的实现部分,但本部分会介绍:
大家都搭建了测试环境。
有些人很幸运,可以在完全独立的环境中运行生产。
-- 佚名
.
在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:
第一部分将介绍现代软件开发的基础 – Git 版本控制系统和各种 Git 流程。
要使用 <DerivedKeyToken>进行签名,请使用以下步骤:
<DerivedKeyToken> 并将其添加到 WS-Security 标头,如创建和添加 <DerivedKeyToken> 中所述。请注意,此步骤还会创建并添加 <DerivedKeyToken> 所基于的 <EncryptedKey> 元素。
<Signature> 元素。为此,请调用 %XML.Security.Signature的 Create() 类方法。例如: set dsig=##class(%XML.Security.Signature).Create(dkt)
此方法返回 %XML.Security.Signature 的实例,该实例表示 <Signature> 标头元素。签名值通过 HMAC-SHA1 摘要算法计算,使用 <DerivedKeyToken> 隐含的对称密钥。
<Signature> 元素适用于消息的一组默认部分;可以指定一组不同的部分。
WS-Security 标头元素。进行加密(一)
WS-Security 标头元素中。为此,请调用 Web 客户端或 Web 服务的 SecurityOut 属性的 AddSecurityElement() 方法。在这种情况下,需要两个参数:a. 安全标头元素(而不是从中生成的的 %XML.Security.EncryptedData)。
b. 引用列表实例。第二个参数指定将第一个参数指定的项目放在何处。如果参数是 A、B,则 IRIS 确保 A 在 B 之后。指定此项以便收件人首先处理引用列表,然后再处理依赖于它的加密安全标头元素。
do client.SecurityOut.AddSecurityElement(userToken,reflist)
如果仅加密了 SOAP 主体,系统会自动将 <EncryptedData> 元素作为 <Body>的子元素。
SOAP 消息。请参阅添加安全标头元素中的一般注释。例如,以下客户端代码对 SOAP 主体和 <UsernameToken>进行加密:
// Create UsernameToken
set userToken=##class(%SOAP.Security.UsernameToken).进行加密
要使用 <DerivedKeyToken> 进行加密,请使用以下步骤:
<DerivedKeyToken> 并将其添加到 WS-Security 标头,如创建和添加 <DerivedKeyToken> 中所述。请注意,此步骤还会创建并添加 <EncryptedKey> 所基于的 <EncryptedKey> 元素。
<EncryptedData> 元素。为此,请调用 %XML.Security.EncryptedData 的 Create() 类方法。在此过程中,请指定以下参数:a. 派生密钥令牌
b. 要加密的项目。省略此参数可加密正文。
c. 指定 <EncryptedData> 元素如何引用 <DerivedKeyToken> 的宏。在此场景中,当前唯一支持的值是 $$$SOAPWSReferenceDerivedKey。
例如,加密 <UsernameToken>:
set refopt=$$$SOAPWSReferenceDerivedKey
set encryptedData=##class(%XML.Security.HI 各位开发者们,
📅2024年9月23日🕑14:00-15:30🕞,InterSystems将举办线上研讨会,点击🔔此处🔔报名参会。
此次研讨会以“面向未来的数据平台——InterSystems IRIS五大亮点提速数据潜力挖掘与AI应用”为主题,帮助您了解InterSystems IRIS数据平台的五大亮点:
IRIS 支持 WS-SecureConversation 1.4 定义的 <DerivedKeyToken> 元素。可以创建并使用<DerivedKeyToken> 元素进行加密和签名,作为前三个主题中描述的方法的替代。
通常,会同时执行加密和签名。为简单起见,本主题分别介绍这些任务。有关结合加密和签名的信息,请参阅结合加密和签名。
<DerivedKeyToken> 元素旨在携带发送者和接收者可以独立使用的信息来生成相同的对称密钥。这些方可以使用该对称密钥对 SOAP 消息的指定部分进行加密、签名或同时执行这两种操作。
要生成和使用 <DerivedKeyToken>,请执行以下操作:
<EncryptedKey>元素。可以从该实体的请求消息中包含的 X.509 证书中获取公钥。或者可以提前获取它。
P_SHA1 算法从原始对称密钥计算出一个新的对称密钥。这将创建一个引用 <EncryptedKey> 元素的 <DerivedKeyToken> 元素。
对这些活动使用不同的对称密钥被认为是一种很好的做法,这样就可以减少用于分析的数据量。
InterSystems IRIS 数据平台作为关系数据库使用时,传统上以行为单位存储数据。现在,由于底层数据结构的灵活性,您也可以按列存储数据。虽然每种选择都有其优点,但在列中存储数据(称为列式存储)可以在数据分析的业务中显著提高各种用例的性能。列存储自2022.2 版的IRIS起做实验功能引入, 2023.1 起正式支持,到目前已经迭代了几个版本。
假设一家公司使用基于行的存储来保存收到的所有订单数据,跟踪订单 ID、订单日期、客户、优先级、状态和总金额等数据,使用行存储可以被示意为下面的图形:

每一行数据在逻辑上对应一个订单,单行中的所有数据在物理上存储在一起。
这种模式便于快速添加或更新订单。订单可以一次添加一个,数据库的每次写入正好对应一行。当发生了订单的事务,除了要更改的行之外,无需访问或更新表中的任何数据。
让我们考虑另外的情况:假设公司想找到每个月的平均销售收入。为此,您只需要两列的信息: 订单日期和总金额。但是,如果使用基于行的存储,则必须检索每个订单的所有数据才能获得此信息。即使在 OrderDate 列上使用了索引,仍需要读取日期范围内每个订单的完整行,才能获得总金额。如果订单数量较多,这样做的效率会非常低。
这就是列式存储的作用所在。数据不是按行存储在一起,而是按列存储在一起。从逻辑上讲,表和数据之间的关联保持不变。改变的只是物理存储方法。