搜索​​​​

清除过滤器
文章
Qiao Peng · 四月 25, 2022

InterSystems互操作进阶 - 第一篇:InterSystems流程自动化与工作流引擎

InterSystems流程自动化与工作流引擎 InterSystems工作流程引擎的主要功能 2 使用InterSystems工作流程引擎 3 场景描述 3 环境配置与测试 5 任务管理 15 任务API和自定义任务用户界面 16 展望 17 15 集成平台除了集成业务系统,打通数据与业务流程外,另一个核心的功能就是流程自动化(BPA)。 流程自动化涉及几个重要的特性: 流程建模 流程协同 决策自动化 低代码工作流程自动化 任务协同与任务管理 其中第4和5点都是和工作流程相关的。 什么是工作流程(Workflow)?它和业务流程(Business Process)有何区别?为何集成平台要涉及对工作流程的管理? 工作流程是对人工工作任务的流程及其各操作步骤之间业务规则的抽象、概括描述。所以它针对的是人工工作任务,而非业务系统的接口。业务流程与工作流不同,业务流程描述的是特定的业务在各个IT系统间和人工任务间的流程过程和业务抽象。也就是说业务流程范围比工作流程大,是包括工作流程的。 为何要在集成平台里提供工作流程建模和管理的能力?其实医院的所有业务系统都是执行人工任务的,例如医生在HIS中给患者录入诊断、下达医嘱。但并非所有的人工任务和流程在现有的业务系统中都有,例如越来越多的辅助决策系统会提供给医护人员决策建议,这些建议需要医护人员确认才能被采纳。这些辅助决策系统需要被集成平台持续集成:拿到辅助决策的上下文数据,并实时反馈决策建议给业务系统。但它的决策建议缺很难集成进业务系统的工作流程中,这涉及对业务系统的改造 – 改造现有业务系统的流程和用户界面,时间和费用成本高昂。随着辅助决策使用的范围与深度的扩大,通过改造业务系统以纳入对不断涌现的辅助决策支持内容变得越发难以为继。 工作流程引擎可以帮助解决这样的需求,快速满足业务流程优化和再造的需要,创造持续集成的价值。 InterSystems工作流程引擎的主要功能 InterSystems IRIS数据平台、Health Connect医疗集成平台和Ensemble集成平台都内建有工作流引擎。工作流程引擎具有以下功能: 任务角色和用户管理 – 对工作任务的角色定义和角色用户的管理 任务抽象与建模 – 对工作任务的上下文数据模型和任务动作的建模 任务列表 – 对任务进行管理的 任务分配 – 对工作任务进行分配与管理,例如按什么顺序分配任务?任务退回后如何重分配? 任务流程建模和自动化 – 通常工作流程是业务流程的一部分,按业务流程图建立工作流程模型,并自动化执行 任务门户 – 提供给用户的任务界面,用以查看、接受、执行或退回任务 任务API – 提供给第三方系统用以集成的任务查询、接受、执行、退回的API InterSystems数据平台提供了一个针对工作任务的标准业务操作类 -EnsLib.Workflow.Operation,将这个业务操作加入到业务流程即可。它有对应的任务请求消息 –EnsLib.Workflow.TaskRequest 任务响应消息 - EnsLib.Workflow.TaskResponse。这些类都无需修改,直接使用。 使用InterSystems工作流程引擎 场景描述 我们以一个简化的示例为例,说明如何使用工作流。这个示例不需要写代码,完全通过图形化工具和配置工具完成。场景如下: 医生通过医生站下达药嘱后,药嘱发送给药房系统。现在医院上了一套基于机器学习的药品知识库,通过患者的年龄信息、诊断和药嘱,判断药嘱是否有风险。但药房系统尚无法与药品知识库做流程集成,因此我们用InterSystems工作流来做对药剂师的药嘱风险进行提示。整体业务流程图如下: 医生站会发出HL7 V2的药嘱消息OMG_O19,药房系统也接受HL7 V2的药嘱消息OMG_O19。而药品知识库提供服务,需要的请求消息,包含患者诊断、药嘱,并返回警告级别和警告内容。 我们的用例中,医生为控制患者血压开了美托洛尔,但患者有糖尿病,美托洛尔是β受体阻滞剂药物,会影响血糖和血脂的代谢。因此药品知识库会给出药品风险提示。 环境配置 演示环境安装和配置 初始的演示环境在这里下载。 将它导入您的IRIS或HealthConnect平台,如果还没有IRIS,可以下载免费的社区版。 导入后,会看到有Demo.BP.Workflow这个非常简单的业务流程: Production中只有一个业务服务,用来通过文件接收HL7 V2消息,默认的接收文件目录是 C:\Temp\hl7v2\,处理过的HL7文件会保存在C:\Temp\hl7v2\Archive。请配置这2个目录到你本地的可用且有权限的目录。 下载包中提供了样例HL7 V2消息文件,测试时,将其拷贝到接收文件目录即可。 现在我们增加“药剂师复核”的工作任务 向Production中增加操作,弹出页面中: 类名称 选择 EnsLib.Workflow.Operation 操作名称 可以填写“药剂师” 自动创建角色 选择 是 。这样系统会自动检查任务角色名称,如果没有“药剂师”任务角色,会自动帮我们创建 修改业务流程,增加对药剂师角色的任务流程调度 将“待实现药剂师任务”的<empty>流程节点删除,并在原节点上增加“调用(<call>)”流程节点。选择目标为“药剂师”业务操作;取消选中“异步”;给它的名称设置为“提示药剂师药品风险”。 配置药剂师任务 4.1配置任务请求消息 – 应选择EnsLib.Workflow.TaskRequest。这个消息中有这些属性: %Actions:字符串类型,用来让用户执行的操作,如果有多个操作,用逗号分隔。这里我们给药剂师二个操作选项:"取消药嘱,忽略提示"。 %Subject: 字符串类型,任务的主题。今后可用于任务的分析、分配。这里我们设置为"药嘱风险处理"。 %Message:字符串类型,任务的描述。这里我们不赋值。 %Priority: 整数型,任务优先级,1为最高,默认值为3。我们将任务优先级设置为药品风险级别: context.DrugAlertLevel。 %UserName:字符串类型,用于指定任务分配到的具体用户。这里我们计划分配给角色,而不是具体的用户(药剂师),因此不用赋值。 %Title:字符串类型,任务的名称。它和主题不同,是任务的具体名称。这里我们不赋值。 %TaskHandler:字符串类型,任务句柄,设置为响应消息的类名。不用设置。 %Command: 字符串类型,用于向任务句柄传递参数。不用设置。 %FormTemplate: 字符串类型,用于设置用户自定义任务界面的CSP网页名。不用设置。 %FormFields: 字符串类型,用于设置任务用户界面的显示项目名称,多个显示项目名称间用逗号分隔。我们需要显示患者姓名、药品名称、患者诊断、药品风险级别和药品风险信息,设置为"患者姓名,药品名称,患者诊断,药品风险级别,药品风险"。 %FormValues:字符串数组类型,对应%FormFields每个显示项目的值。%FormValues的下标(Key)就是对应的%FormFields的每个显示项目的名称。 其中Key为"患者姓名"的数据从请求HL7消息的PID段的PatientName字节获取,因此值设置为request.{PIDgrp.PID:PatientName}; Key为"药品名称"的数据从上下文变量context的Msg4DrugDB属性的Drug属性中获取,因此值拖拽为context.Msg4DrugDB.Drug; Key为"患者诊断"的数据从上下文变量context的Msg4DrugDB属性的Diagnoses属性中获取,因此值拖拽为context.Msg4DrugDB.Diagnoses; Key为"药品风险级别"的数据从上下文变量context的DrugAlertLevel属性中获取,因此值拖拽为context.DrugAlertLevel; Key为"药品风险"的数据从上下文变量context的DrugAlert属性中获取,因此值拖拽为context.DrugAlert。 4.2配置任务响应消息 – 应配置为EnsLib.Workflow.TaskResponse。这个消息中有这些属性: %Action: 记录了药剂师完成任务时选择了哪个操作。我们需要将它保存到上下文中。直接拖拽callresponse的%Action到context的PharmacistDecision: %Priority:任务优先级,是从任务请求消息拷贝来的。我们无需处理它。 %UserName: 记录哪个用户执行了该任务。我们需要将它保存到上下文中。 %UserTitle:记录执行该任务的用户头衔。我们无需处理它。 %UserRanking: 记录执行该任务的用户在该角色组中的排序。我们无需处理它。 %RoleName:记录执行该任务的角色名称。我们无需处理它。 %Subject:任务的主题,是从任务请求消息拷贝来的。我们无需处理它。 %Message:任务的描述,是从任务请求消息拷贝来的。我们无需处理它。 %Actions:用来让用户执行的操作,是从任务请求消息拷贝来的。我们无需处理它。 %FormTemplate: 用户自定义任务界面的CSP网页名,是从任务请求消息拷贝来的。我们无需处理它。 %FormFields: 任务用户界面的显示项目名称,是从任务请求消息拷贝来的。我们无需处理它。 %FormValues:任务用户界面的项目值。我们无需处理它。 %Status:任务状态,用于查询任务状态。我们无需处理它。 %TaskStatus: 任务状态,用于工作流引擎分配和管理任务。我们无需处理它。 添加业务流程分支,以响应药剂师不同的任务执行结果 在“提示药剂师药品风险”流程节点后面增加对任务执行结果判断,这里需要用“分支<branch>”,而不是“if” - “分支<branch>”可以返回到任何的“标签<label>”节点。 对“分支<branch>”节点,需要设置其条件和标签,在满足条件时转到标签继续执行。因此条件设置为药剂师没有选择“取消医嘱”: context.PharmacistDecision'="取消医嘱";标签选择“药房”。 编译并启动Production 祝贺大家看到这里了,主要工作已经完成,我们没有写任何一行代码、完全通过配置,已经有了如下完整的业务流程图,保存并编译它。 启动Production。 配置工作流角色与工作流用户 启动Production后,系统会自动帮助我们创建“药剂师”工作流角色。可以到管理门户>Interoperability>管理>工作流>工作流角色 确认。 现在要增加一个工作流用户。可以使用你正在使用的IRIS账户作为药剂师用户账户。在管理门户>Interoperability>管理>工作流>工作流用户 页面中选择你的IRIS账户,我这里选择的是SuperUser;并给他一个全名,然后保存。 然后将这个工作流用户加入“药剂师”工作流角色:在工作流角色管理界面点击添加,在用户名中选中刚才创建的工作流用户,其它不用选中,点击确定。现在我们有了可用于测试的工作流用户。 测试 现在我们开始测试: 8.1 检查一下Production是否处于启动状态;然后将示例HL7 V2文件拷贝到接收HL7目录,应该看到这个文件很快就消(处)失(理)了。 8.2登录到任务门户:以药剂师用户帐号登录到管理门户>Analytics>用户门户>工作流收件箱。 可以看到有一个新的“药嘱风险处理”任务,“已分配给”字段时空的,也就是说这个给药剂师角色的人物还没有分配给任何用户。 8.3 这时,我们是看不到任务详情的,但有一个“接受”按钮。点击它就会接受该任务。当任务被接受,其他用户就看不到该任务了。 现在,就可以看到任务详情了:我们设置的任务上下文信息,例如患者姓名、药品名称、药品风险提示都可以看到了。同时,页面上面有4个按钮,其中2个“取消药嘱”、“忽略提示”是我们设置给药剂师的操作。 另外2个按钮是什么? 用户接受了、或被分配了任务,但可以点击“放弃”以退回任务,这样任务又称为“未分配”状态,其他用户就可以看到它并点击“接受”以接受任务。 “保存”是用于未完成任务,但中途需要保存信息时使用。例如任务需要用户书写记录,记录书写到一半离开去忙别的事情,可以点击“保存”以保存已经书写的内容。注意,这时任务并没有完成。 8.4 现在我们让药剂师忽略药嘱风险提示,点击“忽略提示”继续发药流程。 8.5 现在让我们回顾一下完整的业务流程: 在可视化追踪中查看刚才的业务,我们可以看到业务流程按照设计,在药品知识库有提示的情况下,启动了药剂师药嘱风险决策支持任务,并在药剂师忽略提示后,将药嘱发送给药房系统。 大家可以更改一下药剂师的决策,看看流程有什么变化。 任务管理 平台管理员可以查看、分配、重分配、修改优先级和取消任务。 以管理员身份登录到管理门户>Interoperability>管理>工作流>工作流任务,可以查看包括完成的任务在内的所有任务,并可按不同的条件排序。 如果要分配任务,在“用户名”中选择要分配给的用户; 如果要调整任务优先级,选择“优先级”; 如果要取消任务,选中“是否取消”选择框,即可取消。 另外,任务管理员可以将已取消或已完成的任务重新激活。 任务API和自定义任务用户界面 前面介绍了工作流建模、使用工作流门户管理工作任务。如何使用自己的应用或界面管理工作流任务? 有几种方法: 管理门户是网页,它可以被嵌入到其它应用中。即其它应用可以直接通过单点登录,登录到管理门户进行操作。 使用InterSystems平台的任务管理API,然后自己开发任务用户界面或直接在自己的应用中调用。 我个人推荐方法2: 社区里有一篇非常棒的文章,介绍任务管理API和如何使用这些API和Angular进行自定义的任务用户界面开发。 其中任务管理API可以在此下载 自定义任务管理界面可以在此下载 展望 现在的IT应用都是“复合应用”:当今所有应用系统建设即不是原来的纯单体应用开发项目、也不是仅与其它系统整合的集成项目,而是一个复合应用项目 – 每个新业务都需要快速开发并和别的应用集成。 InterSystems工作流引擎为人工工作流程建模提供了低代码/免代码开发的支持。同时,它也赋能复合应用开发: 使用InterSystems工作流和业务流程建模、自动化机器学习引擎或第三方机器学习引擎,可以将基于机器学习的辅助决策支持整合到业务流程中,形成决策过程闭环和机器学习优化闭环。 基于InterSystems工作流,可以将传统编码开发实现的人工工作流程开发通过低代码的业务流程建模方式实现,赋能业务团队高度参与到业务流程梳理、建模与优化中;它将业务流程逻辑与用户界面分离,从而提高业务团队参与度、降低开发成本、快速满足业务进化需求、提高架构灵活性。
文章
Claire Zheng · 三月 28

InterSystems通过矢量搜索扩展了InterSystems IRIS数据平台,支持下一代人工智能应用

2024年3月26日,InterSystems数据平台全球主管Scott Gnau发文,宣布InterSystems IRIS数据平台新增了矢量搜索(vector search)功能。 本文作者为Scott Gnau,InterSystems数据平台全球主管。 人工智能具备变革性潜力,能够从数据中获取价值和洞察力。我们正在迈向一个几乎所有应用都将通过人工智能来驱动的世界,随之而来的,是构建这些应用的开发人员需要正确的工具从这些应用中创造体验。因此,InterSystems非常高兴地宣布这一消息——IRIS数据平台新增了矢量搜索(vector search)功能。 在使用大型语言模型时,像矢量搜索这样的工具对于从海量数据集中高效、准确地检索相关信息至关重要。通过将文本和图像转换为高维矢量,这些技术可以支持快速比较和搜索,即便处理分散在整个组织、不同数据集的数百万个文件时也是如此。 InterSystems IRIS数据平台为下一代应用提供了统一基础 在InterSystems,我们始终在探寻各种方式,使下一代数据处理尽可能地离客户数据近一些,而无需将数据传输到特定系统。将矢量搜索功能添加至InterSystems IRIS数据平台后,我们可以通过矢量嵌入(vector embedding)对数据平台进行搜索,从而增强软件在自然语言处理(NLP)、文本和图像分析相关任务中的功能。这种集成将使开发人员能够更轻松地创建使用生成式人工智能的应用程序,以完成各种用例的复杂任务,并根据InterSystems处理的专有数据(proprietary data)提供即时响应。这也意味着他们可以使用精巧的矢量化索引来完成这项工作,同时对保持内部专有产权情报的安全充满信心。 这一功能支持InterSystems IRIS数据平台管理和查询内容及相关的密集矢量嵌入,特别是能够与RAG集成,开发基于生成式人工智能的应用。随着可用工具集的快速发展,无缝RAG集成可支持新模型和用例的敏捷采用。 这项技术能够给客户带来哪些益处? BioStrand是一家依赖于人工智能的药物发现公司,也是InterSystems创新计划(InterSystems Innovation Program)的一部分(该计划帮助初创企业在我们的IRIS平台上构建应用)。BioStrand的核心产品是Lensai平台,这是一种多功能解决方案,支持包括抗体药物发现和设计在内的各种应用。通过先进的算法,Lensai可以迅速识别并设计新型药物化合物,大大缩短了从开发到商业化的研发时间。该模型将采用先进堆叠技术的大型语言模型(LLM)的优势与BioStrand的专利技术HYFT独特地结合在一起。 HYFT是一种嵌入类型,在生物序列中充当独一无二的“指纹”,使BioStrand能够高精度地分配来自不同LLM的嵌入。这个基础模型代表着一个庞大且不断扩展的知识图谱,在6.6亿个数据对象中映射了250亿种关系,令人印象深刻。这个全面的图谱将整个生物圈的序列、结构、功能以及书目信息相互连接在一起。它还融合了检索增强生成、SQL矢量搜索等尖端技术,以及LLM的生成能力和知识图谱的语义表达能力。 矢量搜索将从根本上改变开发人员与IRIS的交互方式 在实施这项技术方面,我们还只是刚刚起步。随着客户与数据的交互方式因矢量搜索而得到改变,随着新的人工智能应用不断通过应用矢量搜索而得到开发,我们将分享更多客户故事。与此同时,我也推荐您访问我们的矢量搜索页面,了解更多信息。 我们加速创新,确保客户成功,并展示对卓越的承诺,与此同时,我们致力于维护最高标准的隐私、安全和责任,这将引导我们以一种深思熟虑、公正的方式对待人工智能,从而创造信任。我们相信,透明度、责任感和可解释性是建立对人工智能系统的信任并推动其创新的关键。
文章
Louis Lu · 三月 12, 2021

第 1 天:使用 InterSystems Object 和 SQL 进行开发

原文在这里。 原作者YURI MARX GOME 我正在参加 Joel Solon 讲授的“使用 InterSystems Objects 和 SQL 进行开发”课程。 课程非常好,我将在这里分享一些从培训中总结的提示。 第 1 天的提示: 1. InterSystems IRIS 统一了:InterSystems IRIS Database (Caché)、IRIS Interoperability (Ensemble)、IRIS Business Intelligence (DeepSee) 和 IRIS Text Analytics (iKnow)。 2. IRIS 为多模型:对象、关系、文档和多维。 3. 互操作性:从 Java、.NET 和其他语言(如 ObjectScript)进行原生访问;ODBC 和 JDBC 数据访问,SOAP/REST 服务访问;数据路由、转换和工作流驱动消息;支持 ESB 的 SOA 架构。 4. IRIS 是事务和分析的结合。 5. IRIS 使用 ECP(用户量的分布式缓存)和Sharding进行水平数据量扩展。 6. 使用 Cloud Manager 在公共或私有容器中部署。 7. 3 种待开发 IDE 选项:VSCode(最受欢迎)、Studio(仅限 Windows)、Atelier(已弃用)。 8. 适用于 CLI 命令的终端工具。 9. 基于浏览器的管理门户。 10. IRIS 支持多平台(UNIX,Linux,Windows),并为 Linux 提供了 Docker 选项。 11. 提供年度版本 20##.1(EM - 扩展维护)和季度版本(CD - 连续交付)。 12. IRIS 区分大小写,推荐采用驼峰表示法。 13. 类是方法和属性的容器。 14. 方法执行特定任务,不允许方法重载(类中具有两个同名方法)。 15. 有 2 种类型的方法:ClassMethod(与对象实例不关联的操作)和 Method(与对象实例相关联的操作)。 16. 使用 ##class() 运行类方法并创建实例(利用 %New 或 %OpenId)以执行 Methods。 17. 方法参数的默认类型为 %String。 18. 符号 ... 表示变量参数。 示例:Method Sample(a As %String, b... as %String) as %Status。 19. 将参数作为方法调用方传递时: 如果使用 . 则作为引用传递; 参数是可选的,您可以使用 $data() 借助调用方传递的参数进行测试。 20. string 是变量的默认类型。 21. ObjectScript 支持动态类型。 22. 在 ObjectScript 中,0 为 false,其他值为 true。 23. 软件包允许您将类整理到文件夹中。 24. 如果在类或方法中使用导入,则不需要将限定名称引用到类。 25. 持久类(存储在磁盘中)扩展 %Persistent。 26. 持久类具有保持类特性/值的属性。 27. 每个持久类都有一个唯一的不可变 ID 编号。 PS 1:我用 40,000 积分兑换了这个为期 5 天的课程(价值 2800 美元) (https://globalmasters.intersystems.com/rewards/34/reward_redemptions/new) PS 2:Joel Solon 是一位出色的讲师(提供了优秀的 IRIS 认证提示) PS 3:课程材料非常好,课程资源、工具和支持都很棒。 明天我会发布第 2 天的总结。
公告
Michael Lei · 一月 9, 2022

2021 年英文社区Top 问题

a {color:#2a2e78;} 嘿,社区。 这里是2021年度开发社区问题摘要。 让我们来看看InterSystems开发人员提出的最受欢迎的问题。 统计 ✓ 2021年提出了980 个问题✓ 社区总共提出了5,699 问题 最多浏览问题 WINDOWS ODBC CACHE 驱动 by Fernando Zañartu 2,113 SOAP 错误 CONTENT-TYPE 返回 text/html 而不是 text/xml by Kurro Lopez 741 如何用xmlns 和 xsi:type 属性解析xml by water huang 733 ODBC 驱动 by Brian Bechard 667 VS Code中的意外Token错误 by David Hockenbroch 646 Log4j 脆弱性 by JOSE PALAU 597 如何在SQL查询中获得行编号? by Anderson Negreli 541 httpRequest POST 文件上传by Emanuel Lazar 527 Log4Shell Apache 影响 / Intersystems产品by Andy Stobirski 486 Intersystems Cache Studio 下载 by Joseph Lovato 461 如何在httpResponse对象中设置HTTP Response 状态编码 by Mike Yackanich 441 JSON解析空值null values in by Lucas Macori 398 如何快速简单从老的Dot Scoping转化为新的Parentleses Scoping? by Dominic Chui 397 从Caché 数据库到 IRIS数据库的转化. by Сергей Марушко 383 JSON Web Token令牌 授权与不记名令牌Tokensby Neil Thaiss 371 在另一个命名空间中调用类的方法 by Nigel Salm 371 超出License 限制? by yeung elijah 364 锁 /解锁 by Matjaz Murko 352 JWT/OAuth2.0 by M C 344 转化 ISO-8859-1 输入文件 by Michoel Reach 332 显示所有英文社区问题 » 显示所有中文社区问题 » 讨论最多的 Debugging功能不见了 by Anna Golitsyna 24 在 %SYS 命名空间外获得用户属性 by Evgenii Ermolaev 22 从 VS studio终端运行Python脚本 by Akshay Pandey 20 VS Code中的意外Token错误 by David Hockenbroch 20 JSON对象上的SQL 搜索索引. by Güvenal 20 锁 /解锁 by Matjaz Murko 19 IRIS - 原生 API 和 .NET Provider - 回归到 Cache .net Provider ?by Emanuel Lazar 18 &sql(.....) 不工作且返回SQLCODE -400 by prashanth ponugoti 18 修改 %Stream 内容 by Marlin Mixon 17 收到错误 #9406 by Rick Prichett 16 在VSCode转化 ObjectScript格式 by Julian Matthews 16 从Caché 数据库到 IRIS数据库的转化. by Сергей Марушко 15 Ensemble用SQL批量插入 by Jimmy Christian 14 #5003 没有实施by Gary Koester 14 动态 SQL 参数化 UPDATE vs INSERT的问题 by Jonathan Anglin 14 如何区分命名空间 Globals 和 Routines 数据库 ? by Muhammad Waseem 14 如何测试从虚拟文档到FLR的转化 by Werner Beukes 14 第一个REST 操作 - 定制Header by Scott Roth 14 vscode 新 routines 没有显示 by Paul Price 14 显示 %GlobalCharacterStream by Rochdi Badis 13 显示所有英文社区问题 » 显示所有中文社区问题 »
文章
Jingwei Wang · 七月 28, 2022

InterSystems SQL 的使用 - 第七部分 - Stored Procedures

定义 Stored Procedures 可以使用以下方式定义stored procedures 使用DDL定义存储过程 使用类方法定义存储过程 使用DDL定义存储过程 CREATE PROCEDURE 可以创建一个查询,它总是作为一个存储过程被预测。一个查询可以返回一个单一的结果集。 CREATE PROCEDURE AgeQuerySP(IN topnum INT 10, IN minage INT 20) BEGIN SELECT TOP :topnum Name, Age FROM Sample.Person WHERE Age > :minage; END 列表中的每个参数声明包括(按顺序)。指定参数模式是IN(输入值),OUT(输出值),还是INOUT(修改值)。如果省略,默认的参数模式是IN,参数名称是区分大小写的。 CREATE QUERY 可以创建一个可以选择作为存储过程投射的查询。一个查询可以返回一个单一的结果集,这个查询可能是也可能不是作为存储过程公开的。要创建一个作为存储过程公开的查询,你必须指定PROCEDURE关键字作为其特征之一。你也可以使用CREATE PROCEDURE语句来创建一个作为存储过程公开的查询。 为了创建一个查询,你必须拥有%CREATE_QUERY管理权限,正如GRANT命令所指定的那样。如果类的定义是一个已部署的类,你不能在该类中创建一个查询。 CREATE QUERY AgeQuery(IN topnum INT DEFAULT 10,IN minage INT 20) PROCEDURE BEGIN SELECT TOP :topnum Name,Age FROM Sample.Person WHERE Age > :minage ; END 使用类定义存储过程 要定义一个方法存储过程,只需定义一个类方法并设置其SqlProc关键字。 Class MyApp.Person Extends %Persistent [DdlAllowed] { ​ /// This procedure finds total sales for a territory ClassMethod FindTotal(territory As %String) As %Integer [SqlProc] { // use embedded sql to find total sales &sql(SELECT SUM(SalesAmount) INTO :total FROM Sales WHERE Territory = :territory ) ​ Quit total } } 这个类被编译后,FindTotal()方法将作为存储过程MyApp.Person_FindTotal()投射到SQL。你可以使用该方法的SqlName关键字改变SQL对存储过程的命名。 该方法使用一个存储过程上下文处理程序,在存储过程和其调用者(例如,ODBC服务器)之间来回传递存储过程上下文。这个过程上下文处理程序是由InterSystems IRIS使用%sqlcontext对象自动生成的(作为%qHandle:%SQLProcContext)。 %sqlcontext由SQLCODE错误状态、SQL行数、错误信息等属性组成,使用相应的SQL变量进行设置,如下所示。 SET %sqlcontext.%SQLCODE=SQLCODE SET %sqlcontext.%ROWCOUNT=%ROWCOUNT SET %sqlcontext.%Message=%msg 使用 Stored Procedures 当执行一个以SQL函数为参数的存储过程时,使用CALL来调用该存储过程,如下面的例子. CALL sp.MyProc(CURRENT_DATE) SELECT查询不支持执行带有SQL函数参数的存储过程。SELECT支持用一个SQL函数参数执行一个存储函数。 xDBC不支持使用SELECT或CALL来执行一个带有SQL函数参数的存储过程。 你可以在一个SQL查询中使用一个存储函数,就像它是一个内置的SQL函数一样。函数的名称是存储函数的SQL名称(在这里是 "Square"),由定义它的schema(包)名称限定(在这里是 "MyApp")。 下面的查询使用了Square函数。 SELECT Cost, MyApp.Utils_Square(Cost) As SquareCost FROM Products 查询Stored Procedures 信息 INFORMATION.SCHEMA.ROUTINES持久化类显示关于当前命名空间中所有routine和程序的信息。 下面的例子返回routine名称,方法或查询名称,routine类型(PROCEDURE或FUNCTION),routine主体(SQL=带SQL的类查询,EXTERNAL=不带SQL的类查询),返回数据类型,以及当前名称空间中模式 "Sample "中所有routine的routine定义。 SELECTROUTINE_NAME,METHOD_OR_QUERY_NAME,ROUTINE_TYPE,ROUTINE_BODY,SQL_DATA_ACCESS,IS_USER_DEFINED_CAST, DATA_TYPE||' '||CHARACTER_MAXIMUM_LENGTH AS Returns,NUMERIC_PRECISION||':'||NUMERIC_SCALE ASPrecisionScale, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='Sample' INFORMATION.SCHEMA.PARAMETERS持久化类显示当前命名空间中所有routine和程序的输入和输出参数的信息。 下面的例子返回了当前命名空间中模式 "Sample "中所有routine的routine名称、参数名称、是输入参数还是输出参数,以及参数数据类型信息。 SELECT SPECIFIC_NAME,PARAMETER_NAME,PARAMETER_MODE,ORDINAL_POSITION, DATA_TYPE,CHARACTER_MAXIMUM_LENGTH AS MaxLen,NUMERIC_PRECISION||':'||NUMERIC_SCALE AS PrecisionScale FROM INFORMATION_SCHEMA.PARAMETERS WHERE SPECIFIC_SCHEMA='Sample'
文章
Claire Zheng · 七月 6, 2021

InterSystems Caché系统运维培训:InterSystems Caché系统高可用与数据库镜像

近日,InterSystems极客俱乐部举办了线上直播“InterSystems Caché系统运维培训”,这是系列视频之一。InterSystems中国资深售前顾问祝麟讲解了“InterSystems Caché系统高可用与数据库镜像”。
文章
Michael Lei · 九月 9, 2021

来自海外的全球独立调查:为什么InterSystems IRIS医疗版是医疗IT开发者的最佳选择

挑战一:缺乏一个统一的技术体系?InterSystems IRIS 医疗版通过统一的数据库、互操作性/中间件、机器学习和FHIR等医疗行业特有的功能来简化开发,开箱即用。 挑战二:需要高性能的解决方案,可以定制适合医疗行业使用的案例InterSystems IRIS for Health医疗版由医疗行业开发人员创建并为医疗服务服务,具有所需的性能、可扩展性和灵活性,大量的全球、全国大型顶级医院案例。全美排名前20医院,全国客户数百家,百强医院30余家; 挑战三:开源和专有软件缺乏灵活性,无法为医疗行业应用提供高可靠性。InterSystems IRIS医疗版实现一套平台兼容专有和开源模块,同时开发人员可以选择自己喜欢的开发语言和灵活性,支持多种开发语言(ObjectScript,.net, Java, Sql, 等等) 挑战四:缺乏具有医疗卫生领域专业知识的供应商,也没有为开发人员提供持续的支持。InterSystems IRIS 医疗版的产品开发能力、屡获殊荣的支持和长期深耕医疗的企业文化,确保开发人员持续成功。
文章
Michael Lei · 九月 13, 2022

使用 Globals存储思维导图

Globals是InterSystems IRIS的数据持久性的核心。它很灵活,允许存储JSON文档、关系数据、面向对象的数据、OLAP立方体和自定义数据模型,例如思维导图。要了解如何使用globals来存储、删除和获取思维导图数据,请遵循以下步骤: 1. 把repo Clone/git到任意本地目录 $ git clone https://github.com/yurimarx/global-mindmap.git 2. 在该目录下打开Docker 终端并执行: $ docker-compose build 3. 启动 IRIS 容器: $ docker-compose up -d 4. 访问 http://localhost:3000 来使用思维导图的前端并创建类似以上的思维导图 本例子的源代码 存储数据 (更多请访问: https://www.npmjs.com/package/mind-elixir): { topic: 'node topic', id: 'bd1c24420cd2c2f5', style: { fontSize: '32', color: '#3298db', background: '#ecf0f1' }, parent: null, tags: ['Tag'], icons: ['😀'], hyperLink: 'https://github.com/ssshooter/mind-elixir-core', } 注意parent属性,它被用来在mindmap节点之间建立父/子关系。 使用Globals 来存储思维导图的源代码 ClassMethod StoreMindmapNode /// Store mindmap node ClassMethod StoreMindmapNode() As %Status { Try { Set data = {}.%FromJSON(%request.Content) Set ^mindmap(data.id) = data.id /// set mindmap key Set ^mindmap(data.id, "topic") = data.topic /// set topic subscript Set ^mindmap(data.id, "style", "fontSize") = data.style.fontSize /// set style properties subscripts Set ^mindmap(data.id, "style", "color") = data.style.color Set ^mindmap(data.id, "style", "background") = data.style.background Set ^mindmap(data.id, "parent") = data.parent /// store parent id subscript Set ^mindmap(data.id, "tags") = data.tags.%ToJSON() /// store tags subscript Set ^mindmap(data.id, "icons") = data.icons.%ToJSON() /// store icons subscript Set ^mindmap(data.id, "hyperLink") = data.hyperLink /// store hyperLink subscript Set %response.Status = 200 Set %response.Headers("Access-Control-Allow-Origin")="*" Write "Saved" Return $$$OK } Catch err { write !, "Error name: ", ?20, err.Name, !, "Error code: ", ?20, err.Code, !, "Error location: ", ?20, err.Location, !, "Additional data: ", ?20, err.Data, ! Return $$$NOTOK } } 我们创建了一个名为^mindmap的Global。对于每个思维导图的属性,它被存储在一个Globals下标中。下标的键是mindmap的id属性。 删除思维导图节点的源代码 - kill the global ClassMethod DeleteMindmapNode /// Delete mindmap node ClassMethod DeleteMindmapNode(id As %String) As %Status { Try { Kill ^mindmap(id) /// delete selected mindmap node using the id (global key) Set %response.Status = 200 Set %response.Headers("Access-Control-Allow-Origin")="*" Write "Deleted" Return $$$OK } Catch err { write !, "Error name: ", ?20, err.Name, !, "Error code: ", ?20, err.Code, !, "Error location: ", ?20, err.Location, !, "Additional data: ", ?20, err.Data, ! Return $$$NOTOK } } 这个例子使用mindmap.id作为mindmap的Global Key,所以删除很容易: call Kill ^mindmap(<mindmap id>) 获得所有存储内容的源代码- 用 $ORDER循环globals ClassMethod GetMindmap - return all mindmap global nodes /// Get mindmap content ClassMethod GetMindmap() As %Status { Try { Set Nodes = [] Set Key = $Order(^mindmap("")) /// get the first mindmap node stored - the root Set Row = 0 While (Key '= "") { /// while get child mindmap nodes Do Nodes.%Push({}) /// create a item into result Set Nodes.%Get(Row).style = {} Set Nodes.%Get(Row).id = Key /// return the id property Set Nodes.%Get(Row).hyperLink = ^mindmap(Key,"hyperLink") /// return the hyperlink property Set Nodes.%Get(Row).icons = ^mindmap(Key,"icons") /// return icons property Set Nodes.%Get(Row).parent = ^mindmap(Key,"parent") /// return parent id property Set Nodes.%Get(Row).style.background = ^mindmap(Key,"style", "background") /// return the style properties Set Nodes.%Get(Row).style.color = ^mindmap(Key,"style", "color") Set Nodes.%Get(Row).style.fontSize = ^mindmap(Key,"style", "fontSize") Set Nodes.%Get(Row).tags = ^mindmap(Key,"tags") /// return tags property Set Nodes.%Get(Row).topic = ^mindmap(Key,"topic") /// return topic property (title mindmap node) Set Row = Row + 1 Set Key = $Order(^mindmap(Key)) /// get the key to the next mindmap global node } Set %response.Status = 200 Set %response.Headers("Access-Control-Allow-Origin")="*" Write Nodes.%ToJSON() Return $$$OK } Catch err { write !, "Error name: ", ?20, err.Name, !, "Error code: ", ?20, err.Code, !, "Error location: ", ?20, err.Location, !, "Additional data: ", ?20, err.Data, ! Return $$$NOTOK } } 用$Order(^mindmap("")) - empty "" - 得到第一个mindmap Global (根节点)。对于每个属性值,我们使用^mindmap(Key,<property name>)。最后,调用$Order(^mindmap(Key))来获得下一个事件。 前端 Mind-elixir和React被用来渲染和编辑mindmap,消耗使用IRIS构建的API后端。见mindmap的反应组件: Mindmap React component - consuming IRIS REST API import React from "react"; import MindElixir, { E } from "mind-elixir"; import axios from 'axios'; class Mindmap extends React.Component { componentDidMount() { this.dynamicWidth = window.innerWidth; this.dynamicHeight = window.innerHeight; axios.get(`http://localhost:52773/global-mindmap/hasContent`) .then(res => { if (res.data == "1") { axios.get(`http://localhost:52773/global-mindmap/get`) .then(res2 => { this.ME = new MindElixir({ el: "#map", direction: MindElixir.LEFT, data: this.renderExistentMindmap(res2.data), draggable: true, // default true contextMenu: true, // default true toolBar: true, // default true nodeMenu: true, // default true keypress: true // default true }); this.ME.bus.addListener('operation', operation => { console.log(operation) if (operation.name == 'finishEdit' || operation.name == 'editStyle') { this.saveMindmapNode(operation.obj) } else if (operation.name == 'removeNode') { this.deleteMindmapNode(operation.obj.id) } }) this.ME.init(); }) } else { this.ME = new MindElixir({ el: "#map", direction: MindElixir.LEFT, data: MindElixir.new("New Mindmap"), draggable: true, // default true contextMenu: true, // default true toolBar: true, // default true nodeMenu: true, // default true keypress: true // default true }); this.ME.bus.addListener('operation', operation => { console.log(operation) if (operation.name == 'finishEdit' || operation.name == 'editStyle') { this.saveMindmapNode(operation.obj) } else if (operation.name == 'removeNode') { this.deleteMindmapNode(operation.obj.id) } }) this.saveMindmapNode(this.ME.nodeData) this.ME.init(); } }) } render() { return ( <div id="map" style={{ height: window.innerHeight + 'px', width: '100%' }} /> ); } deleteMindmapNode(mindmapNodeId) { axios.delete(`http://localhost:52773/global-mindmap/delete/${mindmapNodeId}`) .then(res => { console.log(res); console.log(res.data); }) } saveMindmapNode(node) { axios.post(`http://localhost:52773/global-mindmap/save`, { topic: (node.topic == undefined ? "" : node.topic), id: node.id, style: (node.style == undefined ? "" : node.style), parent: (node.parent == undefined ? "" : node.parent.id), tags: (node.tags == undefined ? [] : node.tags), icons: (node.icons == undefined ? [] : node.icons), hyperLink: (node.hyperLink == undefined ? "" : node.hyperLink) }) .then(res => { console.log(res); console.log(res.data); }) } renderExistentMindmap(data) { let root = data[0] let nodeData = { id: root.id, topic: root.topic, root: true, style: { background: root.style.background, color: root.style.color, fontSize: root.style.fontSize, }, hyperLink: root.hyperLink, children: [] } this.createTree(nodeData, data) return { nodeData } } createTree(nodeData, data) { for(let i = 1; i < data.length; i++) { if(data[i].parent == nodeData.id) { let newNode = { id: data[i].id, topic: data[i].topic, root: false, style: { background: data[i].style.background, color: data[i].style.color, fontSize: data[i].style.fontSize, }, hyperLink: data[i].hyperLink, children: [] } nodeData.children.push(newNode) this.createTree(newNode, data) } } } } export default Mindmap;
文章
Hao Ma · 一月 15, 2021

基于InterSystems IRIS开发的RealWorld应用程序

假设您想编写一些真正的web应用程序,例如medium.com网站的简单克隆。这类应用程序可以在后端使用任何不同的语言编写,也可以使用前端的任何框架编写。编写这样一个应用程序有很多方法,你也可以看看这个项目。它为完全相同的应用程序提供了一堆前端和后端实现。您可以轻松组合它们,任何所选前端应该与任何后端搭配。 我来介绍一下这个使用后端InterSystems IRIS来实现后端的相同的应用程序。 RealWorld项目使用REST并提供预设swagger规范,以及Postman/Newman集合自动化测试。因此,它有助于实现完全相同的REST API。幸运的是,InterSystems已经实现了通过swagger规范生成REST API实现的方法。最佳实践在这里。 我实现这个应用程序的步骤是: 从swagger规范生成API 为应用程序中使用的每个对象类型添加一些持久类,包括 Users Articles Comments 实现API并用Postman测试 最后,用任何前端查看实际效果。 用 docker 启动 你可以自己使用docker 来实验一下。 // clone github repository git clone https://github.com/daimor/realworld-intersystems-iris.git cd realworld-intersystems-iris // build and run it with docker-compose docker-compose up -d --build 启动后可以通过URL http://localhost:12000/conduit获取IRIS中的REST API,可以用newman测试,需要已安装npm和npx包。 APIURL=http://localhost:12000/conduit ./run-api-tests.sh 运行Postman的相同测试 可以通过URL http://localhost/访问前端 可以通过zpm运行UnitTest,只需要进入iris会话 $ docker-compose exec server iris session iris Node: 0790684cf488, Instance: IRIS CONDUIT>zpm zpm: CONDUIT>test realworld [realworld] Reload START [realworld] Reload SUCCESS [realworld] Module object refreshed. [realworld] Validate START [realworld] Validate SUCCESS [realworld] Compile START [realworld] Compile SUCCESS [realworld] Activate START [realworld] Configure START [realworld] Configure SUCCESS [realworld] Activate SUCCESS [realworld] Test START Use the following URL to view the result: http://172.22.0.3:52773/csp/sys/%25UnitTest.Portal.Indices.cls?Index=48&$NAMESPACE=CONDUIT All PASSED [realworld] Test SUCCESS zpm: CONDUIT> 默认使用Vue前端,但也能运行Angular和React web=angular docker-compose up -d --build web web=react docker-compose up -d --build web web=vue docker-compose up -d --build web 通过ZPM安装 InterSystems IRIS部分(后端)可以通过ZPM安装 USER>zpm zpm: USER>install realworld [realworld] Reload START [realworld] Reload SUCCESS [realworld] Module object refreshed. [realworld] Validate START [realworld] Validate SUCCESS [realworld] Compile START [realworld] Compile SUCCESS [realworld] Activate START [realworld] Configure START [realworld] Configure SUCCESS [realworld] Activate SUCCESS zpm: USER> 它将创建`/conduit` Web应用程序,只要设置正确的端口,也能用newman进行测试。 APIURL=http://localhost:52773/conduit ./run-api-tests.sh 可以用ZPM进行UnitTest zpm: USER>test realworld [realworld] Reload START [realworld] Reload SUCCESS [realworld] Module object refreshed. [realworld] Validate START [realworld] Validate SUCCESS [realworld] Compile START [realworld] Compile SUCCESS [realworld] Activate START [realworld] Configure START [realworld] Configure SUCCESS [realworld] Activate SUCCESS [realworld] Test START Use the following URL to view the result: http://172.17.0.2:52773/csp/sys/%25UnitTest.Portal.Indices.cls?Index=4&$NAMESPACE=USER All PASSED [realworld] Test SUCCESS 备注 在开发这个项目的过程中,我遇到了一些问题。 %JSON.Adaptor 它在导入全新对象时效果非常好。但如果需要部分更新现有对象,则%JSONImport对于来源JSON中应该有的必需字段无效。 所以我没用%JSONImport更新对象,而是用了一个从传入的JSON到对象的简单集(如果定义了值)。 只能导出到字符串、流和输出设备。无法导出到原生JSON API需要返回被另一个对象(属性被命名为返回对象的类型)包装的任何对象。并用%JSONExportToString解决了这个问题,对于数组,将其转换为原生JSON 忽略空集合属性(如:数组和列表)的导出。虽然应用程序可能期望得到字段的空数组,但它根本没有得到任何字段 这个问题没解决。太棘手,只能在%JSON.Adapter端解决。 %REST - REST实现的生成器及REST实现本身 即使没有任何更改,`spec`类的任何编译都会更新`impl`类。因此,切记保持生成的部分(如:方法名、参数列表和变量名)不变,否则将会被下一次`spec`编译重写,这可能会在构建用于生产的应用程序时发生。 REST可以有`/users/` 端点,也能获取`/users/`请求,在这种情况下,两者效果相同。但如果只定义了第一种方式,REST就不能识别第二种方式。 要解决这个问题,必须修改swagger规范,只复制带新端点`/users/`的`/users/` Swagger规范定义了参数化请求的默认值,而生成器忽略了 在方法/生成器的代码中手动设置默认值可能会重写方法定义,而参数的设置默认值将被删除。所以可能在部署后破坏实现。 %REST.REST中的方法不可用于覆盖,仅由`disp`类使用,且将被`spec`类的编译完全重写。 无法访问实例的OnPreDispatch方法,也就无法进行更多控制,如:检查访问 Swagger规范定义了哪些端点是公共的,哪些需要授权。%REST生成器无法使用。 API必须用JWT来授权请求,且必须手动检查哪个端点需要检查访问。超出了%OAuth2实现的范围,在IRIS中使用JWT也很麻烦。 在`impl`类中生成的方法应该返回原生JSON对象、流或字符串。但我认为如果它也能接受%JSON.Adaptor对象就很好。 无论如何,实现这样的应用程序是非常有趣的。至少知道了可以用IRIS来实现。 这个应用程序使用了IRIS的这些特性 原生JSON + %JSON.Adaptor REST,及其遵守swagger规范的实现生成器 OAuth2的JWT 容器化 竞赛 这个项目正在参加InterSystems全栈竞赛,如果您喜欢请投票。
文章
Claire Zheng · 一月 20, 2021

InterSystems IRIS数据平台:数据接收速度测试

跨行业用例大多要求具备每秒接收数千或数百万条记录的能力,同时能够支持实时同步查询,例如:股票交易处理、欺诈检测、物联网应用(包括异常检测和实时OEE监控)等。Gartner将这种能力称为“HTAP”(混合事务分析处理)。Forrester等其他公司将其称为Translytics。InterSystems IRIS是功能强大、可扩展、高性能、资源高效的事务分析型数据平台,同时具备内存数据库的高性能以及传统数据库的一致性、可用性、可靠性以及低成本的特性。 混合事务分析处理(HTAP)示例 此示例展示了InterSystems IRIS如何实现每秒接收数千条记录,同时允许对同一集群上的数据进行同步查询,该平台不仅具有很高的接收和查询性能,而且保持了较低的资源利用率。此示例可在单个InterSystems IRIS实例或云端InterSystems IRIS集群上运行。 大家也可以在SAP HANA、MySQL、SqlServer及Amazon Aurora上运行这个示例,以便对性能和资源利用率进行公平、合理的对比。 大家可以在AWS上运行该测试!以下是部分结果: 在AWS上运行InterSystems IRIS和SAP HANA: o在接收记录量方面,InterSystems IRIS比SAP HANA多39% o在查询速度方面,InterSystems IRIS比SAP HANA快3699% 在AWS上运行InterSystems IRIS和AWS Aurora(MySQL): o在接收记录量方面,InterSystems IRIS比AWS Aurora多831% o在查询速度方面,InterSystems IRIS比AWS Aurora快485% 大家可以在自己的PC上使用Docker(3个CPU和7GB RAM)运行该测试!以下是部分结果: 在个人PC上运行InterSystems IRIS和MySQL 8.0: o在接收记录量方面,InterSystems IRIS比MySQL 8.0多3043% o在查询速度方面,InterSystems IRIS比MySQL 8.0快643% 在Ubuntu系统中运行InterSystems IRIS和SQL Server 2019 o在接收记录量方面,InterSystems IRIS比SQL Server 2019多223%,速度也更快 o在查询速度方面,InterSystems IRIS比SQL Server 2019快134,632%(请注意,数字没有打错哦!) o为公平起见,我们未来将在AWS和Azure上对SQL Server进行测试。敬请期待! 在测试任何数据库的运行速度时,请先将速度测试运行一段时间进行预热,然后再记录结果。这样可以对数据库进行预扩展并执行其他操作。每次启动速度测试时,我们都需要清空表格重新开始。 1-在AWS上运行速度测试 请点击链接,查看如何在AWS上运行速度测试以便将InterSystems IRIS和其他数据库(如SAP HANA和AWS Aurora)进行对比。 2- 如何在PC上运行速度测试 在PC上运行速度测试的前提条件是: Docker和Docker Compose Git(可以克隆源代码) 目前,可以使用InterSystems IRIS、MySQL、SqlServer及SAP HANA在PC上运行本示例。 2.1 -在InterSystems IRIS Community上运行速度测试 要想在PC上运行本示例,请确保PC已经安装了Docker。您可以使用以下命令在Mac或Linux系统的PC上快速启动并运行: wget https://raw.githubusercontent.com/intersystems-community/irisdemo-demo-htap/master/docker-compose.yml docker-compose up 如果在Windows系统中运行速度测试,请将docker-compose.yml文件下载到一个文件夹中。打开命令提示符,并切换到该文件夹,然后运行docker-compose up c:\MyFolder\docker-compose up 您也可以将存储库克隆到本地计算机上,从而获得完整的源代码。这时需要安装git,并将其放在git文件夹中: git clone https://github.com/intersystems-community/irisdemo-demo-htap cd irisdemo-demo-htap docker-compose up 这两种技术都可行,并会触发示例中用于演示的镜像文件下载,之后将立刻启动所有的容器。 容器启动过程中,将出现与启动中容器相关的大量消息。这是正常的,不用担心! 启动完成后,它会一直挂在那里,不会把控制权交还给你。这也是正常的。将窗口开着就可以。如果在此窗口上按CTRL+C,docker compose将停止所有容器并停止示例演示。 在所有容器启动之后,在浏览器上打开http://localhost:10000可查看示例的界面。点击“Run Test”按钮即可运行HTAP Demo! 完成Demo演示后,返回到该终端并按CTRL+C。也可以输入以下命令,停止并删除仍在运行的容器: docker-compose stop docker-compose rm 这点很重要,特别是要在一个数据库(如InterSystems IRIS)和另一个数据库(如MySQL)之间反复运行速度测试时。 2.2 -PC上的MySQL 基于MySQL运行此示例,可以输入以下命令: wget https://raw.githubusercontent.com/intersystems-community/irisdemo-demo-htap/master/docker-compose-mysql.yml docker-compose -f ./docker-compose-mysql.yml up 现在,我们将下载一个不同的docker-compose yml文件:一个带有mysql后缀的文件。我们必须在docker-compose命令中使用-f选项来使用此文件。如前所述,将该终端窗口保持打开状态,并在浏览器上打开http://localhost:10000。 示例运行完成后,请返回终端并按CTRL+C。也可以输入以下命令,停止并删除仍在运行的容器: docker-compose -f ./docker-compose-mysql.yml stop docker-compose -f ./docker-compose-mysql.yml rm 这点很重要,特别是要在一个数据库(如InterSystems IRIS)和其他数据库之间反复运行速度测试时。 我们在测试中发现,InterSystems IRIS的数据接收速度比MySQL和Amazon Aurora快25倍。 2.3 -PC上的SQL Server 2019-GA-ubuntu-16.04 基于SQL Server运行此示例,可以输入以下命令: wget https://raw.githubusercontent.com/intersystems-community/irisdemo-demo-htap/master/docker-compose-sqlserver.yml docker-compose -f ./docker-compose-sqlserver.yml up 与前面一样,将该终端窗口保持打开状态,并在浏览器上打开http://localhost:10000。 我们在本地PC上运行速度测试后发现,InterSystems IRIS的数据接收速度比SQL Server快2.5倍,查询速率则快400倍!我们将与AWS RDS SQL Server相比较,进行速度测试并生成报告。 2.4 -PC上的SAP Hana 要在PC上基于SAP HANA运行速度测试,需要满足以下条件: 包含了Ubuntu 18 VM、docker和docker-compose的虚拟机——因为SAP HANA要求对Linux内核参数进行一些更改,否则将无法支持Mac或Windows上的Docker。另外,SAP HANA需要Linux内核4或更高版本。 该虚拟机至少配置9GB RAM,否则将无法启动!虚拟机崩溃后将显示无用的错误消息。 基于SAP HANA运行此Demo,可以输入以下命令: git clone https://github.com/intersystems-community/irisdemo-demo-htap cd ./irisdemo-demo-htap ./run.sh hana 等待下载镜像和启动容器。当docker-compose停止向屏幕写入时,一切已准备就绪。但是请耐心等待——SAP HANA大约需要6分钟才能启动!因此,屏幕会冻结一分钟左右,然后你会看到SAP HANA写入更多文本。这个重复写入过程大约持续6分钟。看到“启动完成!(Startup finished!)”后,就可以开始下一步了。如果在此过程中因为错误而发生崩溃,则可能需要配置更多的内存。 如您所知,与在InterSystems IRIS和MySQL中运行速度测试一样,使用SAP HANA测试不仅仅是运行docker-compose,还需要对Linux内核进行一些配置。大家可以通过run.sh文件来完成这些配置。 我们在虚拟机上运行速度测试后发现,InterSystems IRIS的数据接收速度比SAP HANA快1.3倍,查询数据的速度快20倍,并且使用了更少的内存。 3-资源 我们正在制作有关本示例的视频。在此期间,您可以点击链接查看一篇有意思的文章,该文章介绍了InterSystems IRIS的体系结构,并解释了为什么它能以更快的速度接收和查询数据。 4-该基准测试与YCSB或TPC-H等标准基准测试相比如何? Yahoo Cloud Serving Benchmark(YCSB)是一项开源项目,其目的是开发一个框架和一组通用的工作负载,来评估不同的“键-值存储”和“云”服务的性能。 尽管YCSB上有一些工作负载可以描述成HTAP,但YCSB不一定要依靠SQL来完成。但是该基准必须依靠SQL。 TPC-H侧重于决策支持系统(DSS),而这并不是我们正在研究的用例。 此基准测试针对的是接收速度和查询响应时间之间的关系。我们有一个表格,其中包含许多不同数据类型的列。我们想衡量一个数据库在允许响应式查询的同时,其接收记录的速度能有多快。 这是一个复杂的问题。金融服务和物联网等许多行业都要求每秒必须接收数千条记录。在如此高的接收速率下,内存消耗得非常快。传统数据库需要写入磁盘,而内存数据库也将被迫不断写入磁盘(更改log/journal,甚至在某些情况下部分数据会写入内存,就像传统数据库一样)。问题是:如果InterSystems IRIS不仅要将事务日志写入磁盘(像内存数据库一样),还要异步保持数据库的最新状态,那么InterSystems IRIS是如何做到比内存数据库更快的呢? 一切都与效率有关。接收工作负载会使数据库非常繁忙。CPU和内存都将努力运转。一些内存数据库将尝试压缩内存中的数据。其他内存数据库在内存已满时会将数据持久化到磁盘。所有这些在我们试图实时查询数据库时都有发生。 我们想要证明,在某些工作负载上(例如股票交易、高接收吞吐量[物联网]等),内存数据库的性能不及InterSystems IRIS。这就是我们设计本测试的原因。这意味着该测试比一般用途的测试要简单得多: (1)它只有一个表格,包含19个列和3种差别很大的数据类型 (2)表格上声明了主键(Primary Key)。 (3)我们执行的查询将通过主键(账户ID)获取记录,并使用固定的8个键随机查询:W1A1、W1A10、W1A100、W1A1000、W1A10000、W1A100000、W1A1000000和W1A10000000。这样做的原因如下: 我们知道,在生产系统的内存中保存所有数据是不可能的。内存数据库虽然具有复杂的体系结构,但当内存满了之后,就会将数据移出内存。为了简化测试并使其具有可比性,我们通过主键获取固定记录集,以避免对数据库中可能存在的其他类型的索引进行比较。 通过账号(主键)获取客户账户数据记录是我们许多客户的真实工作负载。数据库在高速接收数据的同时,也需要对查询做出响应。 由于账户ID是主键,因此数据库将使用它的首选(即最优)索引对其进行索引。这样在比较数据库时能够保持公平、简单。 当我们不断请求相同的账号时,数据库有可能将该数据缓存在内存中。这对于内存数据库来说是一项轻松的任务。 InterSystems IRIS是一个混合型数据库。与传统数据库一样,它也尝试将数据保存在内存中。但由于每秒需要接收成千上万的记录,因此内存清理得非常快。通过这个测试可以看到,与其他传统数据库和内存数据库相比,InterSystems IRIS在缓存方面更加智能。你会看到: (1)传统数据库在同时处理接收和查询时表现不佳 (2)内存数据库: 在测试的最初几分钟内表现良好,随着内存填满,数据压缩变得更加困难,不可避免地要写入磁盘 由于系统忙于接收、压缩数据,以及将数据移出内存等,因此查询性能表现不佳。 5-表是怎样的? 以下是我们发送到所支持的全部数据库的建表语句: CREATE TABLE SpeedTest.Account ( account_id VARCHAR(36) PRIMARY KEY, brokerageaccountnum VARCHAR(16), org VARCHAR(50), status VARCHAR(10), tradingflag VARCHAR(10), entityaccountnum VARCHAR(16), clientaccountnum VARCHAR(16), active_date DATETIME, topaccountnum VARCHAR(10), repteamno VARCHAR(8), repteamname VARCHAR(50), office_name VARCHAR(50), region VARCHAR(50), basecurr VARCHAR(50), createdby VARCHAR(50), createdts DATETIME, group_id VARCHAR(50), load_version_no BIGINT ) 插入程序Ingestion Worker会尽可能多地发送INSERT数据,以测量每秒插入的记录数据量以及每秒的兆字节数。 查询程序Query worker将通过account_id从此表中进行选择,并尝试选择尽可能多的记录来测量性能(即每秒选择的记录以及每秒选择的兆字节),以测试端到端性能,并提供工作量证明(Proof of Work)。 端到端性能与一些JDBC驱动程序最优化有关。如果仅执行查询操作,JDBC驱动程序可能不会从服务器获取记录,只有当实际请求列值后,JDBC驱动程序才会从服务器获取记录。 为了证明实际读取的正是我们选取的列,我们将返回的所有fild的字节加起来作为工作量证明。 6-如何实现接收和查询的最大吞吐量? 为了实现最大吞吐量,每个ingestion worker将启动多个线程,每个线程将: (1)为上述表格的每一列准备1000个随机值。这样做是为了让每一列具有不同的数据类型和大小。所以我们希望生成可相应变化的记录 (2)对于要插入的每个新记录,ingestion worker将在每列的1000个值中随机选择一个值,准备好之后,该记录将被添加到批处理中 (3)使用批量插入,默认批量大小为每批1000条记录 Ingestion worker的默认线程数量是15,但是可以在测试过程中单击“设置”进行更改。 另一方面,query worker也启动多个线程来查询尽可能多的记录。如上所述,我们也将提供工作量证明。我们将读取返回的列,并汇总读取的字节数,以确保数据是从数据库通过连接传输进入query worker的,从而避免某些JDBC驱动程序实现优化后,仅在实际使用数据时才通过连接传输数据。我们实际使用返回的数据,并提供每秒读取数据的兆字节总和以及读取的总兆字节数作为工作量证明。 7-占用多少磁盘空间? 在接收171,421,000条记录后,我填满了一个70Gb的数据文件系统。这意味着,每条记录平均占用439个字节(向上取整)。 我还填写了第一个日志目录的100%和第二个日志目录的59%。这两个文件系统都有100Gb,这意味着171,421,000条记录将占用大约159Gb的日志空间,换言之,每条记录平均占用996个字节。 8-HTAP Demo体系架构 HTAP Demo的体系架构如下图所示: 本示例使用docker compose启动五项服务: (1)htapui——这是用于运行示例的Angular UI。 (2)htapirisdb——由于本示例在InterSystems IRIS Community上运行,所以不需要InterSystems IRIS许可证即可运行。但请注意,InterSystems IRIS Community有两个重要限制条件: 最多5个连接 数据库最大为10Gb (3)htapmaster——这是HTAP 示例主程序。UI与主程序对话,主程序与worker对话,以及启动/停止速度测试,并收集指标。 (4)ingest-worker1——这是插入程序ingestion worker。实际上,大家可以拥有多个ingestion worker,只需给每个worker分配不同的服务名称即可。它们将尝试尽快地将记录插入数据库。 (5)query-worker1——这是查询程序query worker,大家也可以拥有多个query worker。它们将尝试尽快地从数据库中读取记录。 在PC上运行示例时,我们使用的是Docker和Docker Compose。Docker Compose需要一个docker-compose.yml来描述这些服务及其使用的Docker镜像。本示例实际上提供了许多docker-compose.yml文件,并且很快将添加更多此类文件: (1)docker-compose.yml——这是针对InterSystems IRIS Community(上述项目及图片中有所描述)运行速度测试的默认演示程序。 (2)docker-compose-mysql.yml——这是针对MySQL的速度测试。大家应该注意到,该测试结果表明,InterSystems IRIS比MySQL快25倍。在Amazon Aurora MySQL(MySQL的微调版本)上运行此测试可得到相同的结果。 (3)docker-compose-sqlserver.yml——这是针对使用Docker部署的SqlServer的速度测试。 (4)docker-compose-enterprise-iris.yml——如果要在标准版本的InterSystems IRIS上运行速度测试示例,这是一个docker-compose.yml的文件例子。 9. 可以在没有容器的情况下在InterSystems IRIS集群上运行本Demo吗? 可以!完成此示例最简便的方法是将此存储库克隆到即将运行master(主程序)和(在同一服务器上运行的)UI的每台服务器上以及每种worker类型(接收和查询worker)上。你可以根据自己的需要,拥有任意数量的接收worker和查询worker! 对于InterSystems IRIS,请查看文件夹./standalone_scripts/iris-jdbc.中的文件。每个服务器都有一个脚本: (1)在主程序上:start_master_and_ui.sh——此脚本将启动主程序和UI。 (2)在Ingestion Worker上:start_ingestion_worker.sh——此脚本将启动Ingestion Worker,后者随后将与主程序连接并进行注册。 (3)在Query Worker上:start_query_worker.sh——此脚本将启动query worker,然后query worker将与主程序连接并进行注册。 对于InterSystems IRIS,大家有两种选择: (1)可以使用start_iris.sh脚本在Docker容器上启动InterSystems IRIS服务器进行快速测试。 (2)可以手动或使用ICM设置InterSystems IRIS集群。然后做一些有趣的事情,比如: 使接收和查询worker都指向同一InterSystems IRIS 使用ECP配置InterSystems IRIS,让ingestion worker指向数据库服务器,同时让query worker指向ECP服务器 配置分片的InterSystems IRIS集群 等等 只要确保更改start_master.sh脚本中对应使用正确的InterSystems IRIS端点、用户名和密码来配置环境变量。 10-自定义 10.1 -如何配置本Demo让其与更多worker、线程等一起工作? Docker-compose.yml文件中的环境变量支持配置所有内容。docker-compose.yml文件只是个不错的起点:大家可以复制它们并对副本进行更改,从而得到更多的worker(如果在PC上运行,不会有太大区别),每个worker类型都可以得到更多线程数,还可以更改接收数据的批处理大小,以及各查询之间的等待时间(以毫秒为单位)等。 10.2 -可以更改表的名称或结构吗? 可以,但必须: (1)在PC上将复制此存储库 (2)更改源代码 (3)使用shellscript build.sh在PC上重建demo。 更改表的结构也很简单。 复制了该存储库后,需要更改/image-master/projects/master/src/main/resources文件夹下的文件。 如果更改表的结构,请确保使用与现有表相同的数据类型,这些数据类型是受支持的。另外还可以更改表的名称。 其次,需要配合更改其他* .sql脚本,如INSERT脚本、SELECT脚本等。 最后,只需运行build.sh来重建demo就可以了! 11-其他示例应用程序 我们还有一些其他涉及不同主题的InterSystems IRIS 示例应用程序,例如NLP、ML、与AWS服务的集成、Twitter服务、性能基准测试等。以下是其中的部分内容: (1)HTAP Demo——混合事务分析处理(HTAP)基准。可以测试InterSystems IRIS同时插入和查询数据的速度。你会发现它的速度比AWS Aurora快20倍! (2)欺诈预防——InterSystems IRIS通过机器学习和制定业务规则,防止金融服务交易中出现欺诈行为。 (3)Twitter情绪分析——演示InterSystems IRIS如何实时使用Tweet,并通过其NLP(自然语言处理)和业务规则功能来评估Tweet的情绪和元数据,从而决定何时与某人联系以提供支持。 (4)HL7协议和SMS(文本消息)应用程序——演示InterSystems IRIS医疗版如何解析HL7协议消息,从而给患者发送SMS(文本消息)提醒。它还演示了基于存储在标准化数据湖中预约数据的实时仪表板。 (5)Readmission Demo——患者再入院在医疗保健领域被称为"机器学习的Hello World"。针对这个问题,我们在本示例中演示了如何使用InterSystems IRIS安全地构建并运行用于实时预测的ML模型,以及如何将其集成到应用程序中。本InterSystems IRIS医疗版示例旨在展示如何构建针对再入院问题的完整解决方案。 12-支持的数据库 这是目前为止支持的数据库列表: Runing on your PC with docker-compose (NO mirroring/replication) InterSystems IRIS 2020.2 MySQL 8.0 MariaDB 10.5.4-focal MS SQL Server 2019-GA-ubuntu-16.04 SAP HANA Express 2.0 (on Linux VM only) Postgres 12.3 Running on AWS: InterSystems IRIS (with or without mirroring) AWS RDS Aurora (MySql) 5.6.10a (parallel query) with replication AWS RDS SQL Server 2017 Enterprise Edition (production deployment) with replication AWS RDS Postgres (production deployment) with replication AWS RDS MariaDB (production deployment) with replication SAP HANA Express Edition 2.0 without replication SAP Sybase ASE 16.0 SP03 PL08, public cloud edition, premium version, without replication AWS RDS Oracle (production deployment) with replication 注:本文为节选,欢迎点击原文链接,了解更多详情。
文章
Claire Zheng · 一月 20, 2021

InterSystems IRIS医疗版2020.1 HL7基准测试

简介 最近完成了针对IRIS医疗版2020.1版本的性能及可扩展性基准测试,重点关注HL7v2的互操作性。本文介绍了在各种工作负载下观察到的吞吐量,并提供了IRIS医疗版用作HL7v2消息传输互操作性引擎时的系统常规配置和调整准则。 基准测试模拟了与实际环境接近的工作负载(详细信息请参见“工作负载说明和方法”部分)。本次测试的工作负载包括HL7v2患者管理(ADT)和生命体征结果(ORU)数据,并包含数据内容转换和路由。 IRIS医疗版2020.1版本可以表明,采用第二代Intel®Xeon®可扩展处理器和Intel®Optane™SSD DC P4800X系列SSD存储的商用服务器,每天的持续消息吞吐量超过23亿条(入站和出站总量),与此前的Ensemble 2017.1 HL7v2吞吐量基准测试相比,扩展性提高了一倍多。 在这些测试过程中,将IRIS医疗版配置为先进/先出(FIFO)顺序,并且在磁盘中完整保存每个入站和出站消息以及消息队列信息。通过持久化消息队列和消息内容,IRIS 医疗版能够在系统崩溃时提供数据保护,并提供完整的历史消息搜索和重新发送功能。 下面将继续介绍配置准则,帮助您选择适当的配置和部署,以充分满足工作负载性能和可扩展性需求。 通过实验结果可以证实,IRIS 医疗版能够满足商用硬件上的极端消息吞吐量需求,并且在大多数情况下支持仅用单个小型服务器可为整个组织提供HL7互操作性服务。 结果概述 以下三种工作负载代表了HL7互操作性活动的不同方面: ·T1工作负载:使用HL7消息的简单传递,每条入站消息对应一个出站消息。不需要路由引擎就可以直接将消息从Ensemble业务服务传递到Ensemble业务操作。不使用任何路由规则,也不执行任何消息内容转换。每条入站消息都在数据库中创建了一个HL7消息对象。 ·T2工作负载:通过路由引擎将入站消息平均分成4个分段,并将其路由到单个出站接口(1对1转换)。对每条入站消息执行一次数据转换,并在数据库中创建两个HL7消息对象。 ·T4工作负载:使用路由引擎将单独修改的消息路由到四个出站接口中的每一个接口。平均而言,每次转换都会修改入站消息的4个分段(1条入站消息对应4条出站消息,进行4次转换)。对于每条入站消息,将执行4次数据转换,向外发送4条消息,并在数据库中创建5个HL7消息对象。 这三个工作负载是在一个物理48核系统上运行的,该系统有两个Intel®可扩展Gold 6252处理器和两个运行Red Hat Enterprise Linux 8的750GB Intel®Optane™SSD DC P4800X SSD驱动器。测试记录每秒(和每小时)入站的消息数、每秒(和每小时)出站的消息数,以及一天10小时内的总消息数(入站与出站)。此外,CPU利用率是用于衡量既定吞吐量水平下可用系统资源的指标。 可扩展性结果 表1:该测试硬件配置的四个工作负载吞吐量汇总 * 包含25%的T1,25%的T2和50%T4的“混合工作负载” 工作负载描述及方法论 测试的工作负载包括HL7v2患者管理(ADT)和生命体征结果(ORU)消息,平均大小为1.2KB,平均14个片段。通过转换大约修改了4个片段(针对T2和T4工作负载)。测试包括48至128个入站接口和48至128个出站接口,通过TCP/IP接收和发送消息。 在T1工作负载中,使用了四个单独的命名空间,每个命名空间有16个接口;T2工作负载使用了三个命名空间,每个命名空间有16个接口;T4工作负载使用了四个命名空间,每个命名空间有32个接口;最后的“混合工作负载”使用了三个命名空间,在所有的接口中:T1工作负载为16个,T2工作负载为16个,T4工作负载为32个。 逐渐增加每个接口上的通信量来衡量可扩展性,以寻找可接受性能标准范围内的最高吞吐量。为了获得可接受的性能标准,必须以持续不变的速率处理消息,无需排队,消息传递没有可测量的延迟,且平均CPU使用率必须保持在80%以下。 之前的测试表明,HL7消息类型对集成的性能或可扩展性没有显著影响;重要的影响因素包括入站消息的数量、入站和出站消息的大小、在路由引擎中创建的新消息的数量,以及修改的消息段的数量。 之前的测试还表明,在数据转换中处理HL7消息的各个字段通常对性能影响不大。这些测试中的转换通过相当简单的赋值来创建新消息。请注意,复杂的处理(例如在数据转换中使用大量的SQL查询)可能会导致结果发生变化。 之前的测试还验证了规则处理的影响通常不大。这些测试中使用的路由规则集平均为32条规则,所有规则都很简单。请注意,非常大或非常复杂的规则集可能会导致结果发生变化。 硬件 服务器配置 测试中使用的服务器采用了第二代Intel®可扩展Gold 6252“Cascade Lake”处理器,带有48核@ 2.1GHz的2插槽系统,每个插槽提供24个核心,并具有192GB DDR4-2933 DRAM和10Gb以太网网络接口。本测试使用的是Red Hat Enterprise Linux Server 8操作系统和InterSystems IRIS医疗版 2020.1。 磁盘配置 通过IRIS 医疗版传递的消息将完全持久化保存到磁盘上。本次测试中系统内部的两个Intel 750GBIntel®Optane™SSD DC P4800X SSD驱动器分开使用,一个用于数据库,一个用于日志。此外,除了确保与真实环境进行比较之外,还对日志启用了同步提交以确保数据持久化。对于本文前面提到的T4工作负载,每条入站HL7消息都会生成大约50KB的数据,这些数据可以进行细分(如表2所述)。事务日志的在线时间通常比消息数据或日志的时间短,在计算总磁盘空间时应该考虑到这一点。 表2:每条入站HL7 T4消息所需的磁盘空间 组成部分 数据要求 分段数据 4.5 KB HL7消息对象 2 KB 消息头 1.0 KB 路由规则日志 0.5 KB 事务日志 42 KB 总计 50 KB 回顾上文,T4工作负载使用路由引擎将每个修改后的消息路由到四个出站接口中的每一个接口。平均而言,每次转换都会修改入站消息的4个分段(1条入站消息对应4条出站消息,进行4次转换)。每条入站消息将进行4次数据转换,将4条消息发送到出站,并在数据库中创建5个HL7消息对象。 在配置生产系统时,计算净需求时应考虑到每日入站量、HL7消息的删除计划以及日志文件的保留策略。此外,应该在系统上配置适当的日志文件空间,以防止保存日志的磁盘卷被占满。出于性能和可靠性方面的考虑,日志文件和数据库文件应分别保存至两个物理磁盘。 结论 InterSystems IRIS医疗版HL7v2消息吞吐量测试结果表明,简单的2插槽商用服务器配置即具有巨大的吞吐量能力,可满足任何组织中的极限消息工作负载的需求。此外,InterSystems致力于通过不断的版本迭代和升级,利用最新的服务器特性或者云技术,达到更高的性能和扩展性。 下图概述并比较了Ensemble 2015.1和Ensemble 2017.1基于英特尔®E5-2600 v3(Haswell)处理器的基准测试,以及Ensemble 2017.1基于第一代Intel®可扩展白金系列(Skylake)处理器的基准测试,和IRIS医疗版2020.1版本基于第二代Intel®可扩展黄金系列(Cascade Lake)处理器的基准测试最新结果。 图1:单个服务器上每天10小时的消息吞吐量(百万) InterSystems IRIS 医疗版不断提高版本之间互操作性吞吐量的标准,并提供灵活的连接功能。如上图所示,IRIS 医疗版消息吞吐量已有显著增加,在T2工作负载情况下比2017版翻了一番,与2015版测试相比,在相同的10小时窗口内吞吐量增加了两倍多,24小时总消息速率保持在23亿以上。 证明IRIS 医疗版性能提升的另一个关键指标是更复杂的T2和T4工作负载(包含转换和路由规则,而不是T1工作负载的纯直通操作)中的吞吐量的提高。 InterSystems可随时与您探讨组织中遇到的与互操作性需求相关的解决方案。 注:本文为译文,欢迎点击查看原文,原文由Mark Bolinsky撰写 这篇能不能发个微信公众号?:) 欢迎查看:https://mp.weixin.qq.com/s?__biz=MzA4MTg3OTU4Mg==&mid=2656760711&idx=1&sn=b098179e1947105917517a7ceeede3f4&chksm=842064f6b357ede044475009db72bf3777a5e18427904f893390e466e16703c289830d0beda6&token=2031523301&lang=zh_CN#rd
文章
Claire Zheng · 一月 21, 2021

InterSystems IRIS History Monitor仪表盘界面展示

大家好! 我想跟大家分享一个个人项目,该项目始于工作中的一个简单需求:“能否知道我们使用了多少个Caché许可证?” 在阅读社区的其他文章时,我发现了一篇David Loveluck写的非常棒的文章:APM——使用Caché History Monitor。 我根据David的这篇文章,开始使用Caché History Monitor并显示所有这些信息。 在面临“选择哪种很酷的技术”这个问题时,我决定使用简单而强大的CSP,这样我的客户可以认识到Caché不仅仅是MUMPS/终端。 在创建了页面以显示许可、数据库增长和CSP会话的历史记录后,我决定为System Dashboard和进程页面创建一个新设计。 我的Caché实例运行得良好。 但是,如果使用IRIS呢?根据Evgeny Shvarov的文章:在InterSystems IRIS开发存储库中使用Docker,我实现了docker技术,并把代码放到了GitHub上,现在大家只需几个步骤就可以进行尝试。 如何运行? 如要使用这里的repo进行编码,请执行以下操作: 1. 通过Clone/git命令将repo 更新到任意本地目录中: $ git clone https://github.com/diashenrique/iris-history-monitor.git 2. 打开这个目录下的终端,并运行: $ docker-compose build 3. 在项目中运行IRIS容器: $ docker-compose up -d 如何测试 打开浏览器,并转到链接:http://localhost:52773/csp/irismonitor/dashboard.csp 使用用户名_SYSTEM可以运行仪表盘dashboard和其他功能。 系统仪表盘 系统仪表盘(System Dashboard)可展示: ·许可 ·系统时间 ·应用程序错误 ·缓存过程 ·CSP会话 ·Lock Table ·日志空间 ·日志状态 ·ECP AppServer ·ECP DataServer ·编写守护进程 ·缓存效率 ·严重警告 折线图小工具每5秒绘制一个点: 系统菜单 系统进程 进程过滤器 通过使用不同的过滤器可以实现你所需的结果。也可以使用“Multiple Sort(多重排序)”,按Shift +单击列标题,甚至可以将数据网格导出到Excel! History Monitor(历史记录监控器) CSP会话和许可的History Monitor可显示三个部分的信息: ·每5分钟 ·每天 ·每小时 “Database Growth”部分只显示当日信息。历史记录页面共享以下功能: Date Range Picker(日期选择插件) 默认值为“过去7天” Chart / Data Table(图表/ 数据表) 在每个部分的右上角有两个按钮(Chart / Data Table [图表/ 数据表]) Data Table(数据表)显示创建图表所用的信息,同样可以以Excel格式下载。 Excel中显示CSP中定义的相同格式、内容和组。 缩放 所有图表都有Zoom(缩放)选项,以可视化方式显示更多详细信息。 平均值和最大值 对于“每小时”和“每天”部分,图表显示的是平均值和最大值。 平均值 最大值 希望这篇文章对您有用! 注:本文为译文,点击此处阅读原文,原文由Henrique Gonçalves Dias撰写。
公告
Claire Zheng · 一月 26, 2021

投票时间!InterSystems多模型数据库竞赛

亲爱的社区开发者们! 本周进入 InterSystems多模型数据库竞赛的投票环节!是时候为你所认可的最佳方案投票了! 🔥 投票通道: 点击投票 🔥 如何投票? 使用我们全新的投票引擎和算法提名专家(Experts)和社区提名,您可以选择3个项目,分别投出心目中的第一、第二和第三位。 以下是社区排行榜说明: 社区排行榜: 名次 得分 1st 3 2nd 2 3rd 1 专家(Experts)排行榜会有更复杂的数学计算,不同级别的专家有更多的“点数”权力: 专家(Experts)排行榜: 级别 名次 1st 2nd 3rd VIP级:总经理,版主,产品经理 9 6 3 Global Masters中的专家(Expert)级 6 4 2 Global Masters中的专业(Specialist)级 3 2 1 专家投票也将为按“3-2-1”为社区排行榜贡献出分数。 投票说明 投票在 Open Exchange 竞赛页面 ,用户需要登录 Open Exchange 进行投票(使用开发者社区的账号即可登录)。 投票后您可以取消投票,将宝贵的票票投给其他更心仪的项目, 参赛者可以在投票周修复bug并进一步改进程序,欢迎订阅程序发布,不要错过 ! ➡️ 请查收最新的 InterSystems在线竞赛投票规则. 注:本文为译文,欢迎点击阅读原文,原文由Anastasia Dyubaylo撰写。
公告
Claire Zheng · 四月 7, 2021

InterSystems开发者社区新增“工作”版块

亲爱的开发者们! 现在你可以在InterSystems开发者社区找工作啦!在开发者社区发帖,你可以为自己找一份心仪的工作,也可以为你的公司寻找合适的人才! 那么,具体怎么操作呢? 在顶部菜单栏找到"职位" 版块: 在这里,你可以发现: 工作机会: 你可以找到需要InterSystems技术能力的工作机会; 求贤: 在这里,你可以发帖寻找具备InterSystems数据平台技术能力的优秀人选,在“所需技能”等相关描述中应包含对InterSystems技术的需求。 所以,如果你: 想为拥有InterSystems技术的人提供一个工作机会,或 拥有InterSystems技术能力,且正在寻找新的工作机会 就可以在社区发帖,当然,请在你发的帖子中加入相关tags: 工作机会 求职 以下是一份超简单的发帖攻略: 找到 职位 并点击 "新工作机会" 按钮,, 就可以创建相关帖子。 欢迎你尝试这个新功能,在这里找到合适的员工,在这里找到心仪的工作😉 如果有任何疑问,跟帖讨论与我们联系吧! Precautionary measures: InterSystems 不保证招聘信息及其他在本网站发布信息的准确性 InterSystems 对因本网站所公布的信息而造成的任何损失概不负责,请直接与招聘人员或申请人确认内容及条件 更多内容,请查看 InterSystems开发者社区行为准则.
公告
Claire Zheng · 三月 17, 2021

InterSystems编程大赛: 开发者工具

亲爱的社区开发者们,大家好! 我们很高兴地宣布,新一轮InterSystems开发者竞赛开启了! 🏆 InterSystems 编程大赛:开发者工具 🏆 请提交具有如下特性的应用程序——能够加速开发、贡献更多高质量代码、帮助用户测试、部署、支持或监控基于InterSystems IRIS的解决方案。 时间: 2021年3月29日- 4月25日 Total prize: $8,500 奖项设置 1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名 - $4,000 🥈 第二名 - $2,000 🥉 第三名 - $1,000 2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名 - $750 🥈 第二名 - $500 🥉 第三名 - $250 如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金 谁可以参加? 任何开发者社区的成员均可参加,InterSystems内部员工除外。还没有账号?现在来建一个! 👥 开发者可以组团 创建一个协作应用程序,组团限定人数为2-5人。 请注意,要在您的README文件中标注您的团队成员——社区用户profile. 参赛时间安排 🛠 3月29日 - 4月18日: 应用开发、提交阶段(在此期间,您可以持续编辑自己的项目) ✅ 4月19日 - 25日: 投票阶段 🎉 4月26日: 宣布优胜者! 主题 💡 InterSystems IRIS开发者工具 💡 此次竞赛中,我们希望您提交的应用程序能够改善IRIS开发者的使用体验,贡献更多qualitative code,并帮助用户测试、部署、支持或监控基于InterSystems IRIS的解决方案。 以下是参赛须知 有效应用程序:100%全新的Apps或已有的应用程序(但有显著提升)。所有参赛者/团队提交的应用程序只有经过我们团队的审核之后才会被批准参赛。 应用程序的类型应匹配: UI框架, IDE, 数据库管理, 监控, 部署工具等等 应用程序需要在 IRIS Community Edition 或 IRIS for Health Community Edition 或 IRIS Advanced Analytics Community Edition 上运行。 应用程序应该开源并在GitHub上发布。 应用程序的README文件需要包含安装步骤,并包含视频demo或/和应用程序如何运行的描述。 应用程序的源代码应该以UDL(而非XML)格式提交, 举例说明。 上述要求可能会按需修订。 资源助力 示例程序: iris-rad-studio - RAD for UI cmPurgeBackup - backup tool errors-global-analytics - errors visualization objectscript-openapi-definition - open API generator Test Coverage Tool - test coverage helper and many more. 我们建议您从以下模板开始: objectscript-docker模板 rest-api-contest模板 native-api-contest模板 iris-fhir模板 iris-fullstack模板 iris-interoperability模板 iris-analytics模板 如何将您的APP提交给大赛: 如何在InterSystems Open Exchange上发布应用程序 如何把参赛APP提交给大赛 参赛评比 我们已制定全新投票规则,欢迎关注! 期待您的精彩提交!加入我们的编程马拉松,赢取大奖! ❗️ 点击此处,查看 官方竞赛条款解读.❗️ 最新竞赛启动啦!欢迎大家积极参赛!✿✿ヽ(°▽°)ノ✿(*^▽^*) Pls invite your customers to join. Thx! @Li.Yan @Lu.Wang @Jun.Qian @Peng.Qiao @Louis.Lu @Hao.Ma @Lin.Zhu @Jieliang.Liu 今天就可以开始提交作品啦!