搜索​​​​

清除过滤器
文章
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 API 管理器简介

大家可能已经听说过,我们近期推出了InterSystems API管理器 (以下简称IAM)。InterSystems IRIS数据平台™新增了一项功能,支持用户监视、控制和管理IT基础架构中基于Web的API间通信。 在本文中,我将向大家展示如何设置IAM,并重点介绍IAM中可用的一些功能。InterSystems API管理器可提供你所需的一切功能。 监视基于HTTP的API通信,并了解谁在使用你的API、你最受欢迎的API是什么,哪些可能需要重新实现。 使用多种方式对API用户进行控制及限制。从简单的访问限制、API流量限制,到请求有效负载微调,你可以进行细粒度控制并快速做出反应。 使用集中式安全机制(如OAuth2.0或密钥和令牌身份验证)保护API。 招募第三方开发人员,为第三方开发人员提供一个专门的开发门户来满足他们的需求,并从一开始就为他们提供良好的开发体验。 扩展API需求并实现低延迟响应。 我很高兴为大家介绍IAM,让您一睹为快。 入门 从WRC Software Distribution站点下载IAM,并将其部署为自身的docker容器。 请确保满足以下最低要求: Docker引擎可用。最低支持版本是17.04.0+。 Docker-compose CLI工具可用。最低支持版本是1.12.0+。 第一步需要加载docker镜像,通过如下: docker load -i iam_image.tar 这样一来,IAM镜像可在你的计算机进行后续使用。IAM作为一个独立运行的容器,可以单独从InterSystems IRIS后端对其进行扩展。 启动IAM前,需要访问IRIS实例来加载所需的许可证信息。须进行以下配置更改: 启用/api/IAM web应用程序 启用IAM用户 更改IAM用户密码 现在,我们可以开始配置IAM容器了。在distribution tarball里可以找到一个名为“iam-setup”的Windows和Unix系统脚本。该脚本可帮助你正确地设置环境变量,使IAM容器能够与InterSystems IRIS实例建立连接。这是我在Mac终端会话中的运行示例: source ./iam-setup.sh Welcome to the InterSystems IRIS and InterSystems API Manager (IAM) setup script.This script sets the ISC_IRIS_URL environment variable that is used by the IAM container to get the IAM license key from InterSystems IRIS.Enter the full image repository, name and tag for your IAM docker image: intersystems/iam:0.34-1-1Enter the IP address for your InterSystems IRIS instance. The IP address has to be accessible from within the IAM container, therefore, do not use "localhost" or "127.0.0.1" if IRIS is running on your local machine. Instead use the public IP address of your local machine. If IRIS is running in a container, use the public IP address of the host environment, not the IP address of the IRIS container. xxx.xxx.xxx.xxx Enter the web server port for your InterSystems IRIS instance: 52773Enter the password for the IAM user for your InterSystems IRIS instance: Re-enter your password: Your inputs are:Full image repository, name and tag for your IAM docker image: intersystems/iam:0.34-1-1IP address for your InterSystems IRIS instance: xxx.xxx.xxx.xxxWeb server port for your InterSystems IRIS instance: 52773Would you like to continue with these inputs (y/n)? yGetting IAM license using your inputs...Successfully got IAM license!The ISC_IRIS_URL environment variable was set to: http://IAM:****************@xxx.xxx.xxx.xxx:52773/api/iam/licenseWARNING: The environment variable is set for this shell only!To start the services, run the following command in the top level directory: docker-compose up -dTo stop the services, run the following command in the top level directory: docker-compose downURL for the IAM Manager portal: http://localhost:8002 我隐藏了IP地址和密码,但这足以让大家了解配置是多么简单。现在我们得到了开始下一步前所需的全部内容:InterSystems IRIS实例的完整镜像名称、IP地址和端口,以及IAM用户密码。 现在可以通过执行以下命令启动IAM容器: docker-compose up -d 该命令将开始协调IAM容器,并确保以正确的顺序启动所有内容。 你可以使用以下命令检查容器的状态: docker ps 在浏览器中输入localhost:8002会出现基于web的用户界面: 因为这是一个全新的节点,所以全局报告中未显示任何吞吐量。但我们很快就会改变这个情况。我们可以看到,IAM支持“Workspace(工作区)”概念,将工作划分为“module”和/或“team”。向下滚动并选择“default”工作区会将我们带到“Dashboard”界面。我们将在“default”工作区开始首次实验。 同样,这个工作区的请求数量也是零,但是你可以先在左侧的菜单中了解一下API网关的重要概念。前两个元素——即服务和路由——是最重要的。服务是指向用户公开的API。因此,IRIS实例中的REST API被视为一种服务,就像你所使用的Google API一样。路由决定应将传入请求路由到哪些服务。每个路由都有一组特定的条件,如果满足这些条件,就会将请求路由到相关的服务。大家需要了解的是,路由可以匹配发送者的IP或域、HTTP方法、部分URI,或者其中的几种。 现在让我们创建一个IRIS实例的服务,其值如下: 保留其他所有内容的默认设置。现在让我们创建一个路由: 同样,对其他所有内容保留默认设置。默认情况下,IAM正在监听端口8000上的传入请求。从现在开始,发送到http://localhost:8000并以/api/atelier路径开头的请求将被路由到IRIS实例。 让我们在REST客户端尝试一下(我使用的是Postman)。 向http://localhost:8000/api/atelier/发送一个GET请求会从IRIS实例返回一个响应。每个请求都经过IAM,并监视HTTP状态码、延迟和用户(如果已配置)等指标。我接着发出了另外几个请求(包含对不存在的端点的两个请求,如/api/atelier/test/),可以在Dashboard中看到汇总: 使用插件 既然已经有了一个基本的路由,那么可以开始管理API流量了。现在我们可以开始添加补充服务的行为。现在可以创造奇迹了。 执行某种行为最常见的方法就是添加插件。插件可提供一些功能,并且通常可以附加到IAM的某个部分。它们可能会对全局运行产生影响,也可能只对单个用户(组)、服务或路由等产生影响。首先,我们在路由中添加限速插件。此时需要确保插件和路由之间建立的链接是路由的唯一ID。这些可以从路由的详细信息里找到。 如果按照本文的步骤进行,那么你的路由ID是不一样的。复制ID继续下一步。 单击左侧工具栏菜单上的“Plugins”。通常可以在此界面上看到所有的活动插件,但由于这个节点相对较新,所以未显示任何活动插件。选择“Add New Plugin”继续下一步。 我们要选择的插件在“Traffic Control”类中,名为“Rate Limiting”。选中该插件。由于插件非常灵活,所以我们可以在这里定义非常多的字段,但现在我们只关心两个字段: 如上所示,插件已配置并处于活动状态。你可能已经发现有多种时间间隔可以选择,比如分钟、小时或天。我特意选择了分钟,因为这样可以让我们很容易理解这个插件产生的效果。 如果在Postman中再次发送相同的请求,会发现响应返回了两个附加的头信息:XRateLimit-Limit-minute (value 5) 和XRateLimit-Remaining-minute(value 4)。这是在告诉客户端,每分钟最多可以调用5次,并且在当前时间间隔内还有4个请求可用。 如果不断地发出相同的请求,最终会用完可用配额,得到一个带有以下负载的HTTP状态码429: 等这一分钟结束后,就可以再次调用。这是一个非常方便的机制,可以完成以下工作: 1. 确保后端避免高峰值 2. 为客户端设置一个期望值,即允许以透明的方式为服务进行多少次调用 3. 引入分级制有望从API流量中获利(例如,青铜级别每小时调用100次,而黄金级别则不受限制) 你可以为不同的时间间隔设置值,从而在一定时期内平滑API流量。假设允许某条路由每小时进行600次调用,平均每分钟调用10次。但是,你没有阻止客户端在一小时的第一分钟就用光600次调用(也许这就是你想要的)。也行你想让负载在一个小时内分配得更均匀。将config_minute字段设置为20,这样就可以确保用户每分钟调用的次数不超过20次,每小时不超过600次。这将使分钟级别的间隔出现一些峰值,因为它们平均每分钟只能调用10次,但用户不能在一分钟内用完一小时配额。现在,至少需要30分钟,系统才会达到满负荷运行。客户端将在每个配置的时间间隔内收到附加标头,例如: header value X-RateLimit-Limit-hour 600 X-RateLimit-Remaining-hour 595 X-RateLimit-Limit-minute 20 X-RateLimit-Remaining-minute 16 当然,可以采用多种不同的方法配置rate-limits,这取决于你想要实现的目标。 对此我不再做过多介绍,因为作为一篇介绍InterSystems API Manager的文章,上述介绍已经足够了。IAM还可以用来实现更多的事情。我们刚刚只用了40多个插件中的一个,甚至还没有使用到所有的核心概念,你还可以实现以下任务: 为所有服务添加集中式身份验证机制 通过负载均衡请求扩展到支持同一组API的多个目标 向更小的受众介绍新特性或bugfixes,并在向大家发布之前监视的进展情况 为内部和外部开发人员提供一个专用的、可自定义的开发人员门户,记录他们有权访问的所有API 缓存常见的请求响应,以减少响应延迟和服务系统上的负载 所以,请大家试一试IAM,并在下面评论区留下建议。我们努力推出这一功能,希望了解大家可以使用这项技术克服哪些挑战。 更多资源 官方新闻稿:InterSystems IRIS Data Platform 2019.2 introduces API Management capabilities 短动画视频概述:什么是InterSystems API Manager?(英文) What is InterSystems API Manager 8分钟小视频带你了解主要亮点:InterSystems API管理器简介(英文) Introducing InterSystems API Manager 选自IRIS文档部分内容:InterSystems API管理器文档(英文) InterSystems API Manager Documentation 注:本文为译文,欢迎点击查看原文,原文由Stefan Wittmann撰写 IAM 是只能在docker 里运行吗? 对,目前IAM提供的是容器版本。如果有对IAM的需求,可以联系InterSystems的销售和销售工程师。 欢迎联系Intersystems 中国服务热线:400-601-9890,谢谢!
公告
Claire Zheng · 二月 1, 2021

InterSystems 2021年度编程大奖赛

大家好! InterSystems IRIS开发者们,我们有一个好消息要跟大家分享! 我们很高兴能够邀请大家参加我们今年的年度大奖赛,利用InterSystems IRIS数据平台创建开源解决方案! 🏆 InterSystems编程大奖赛 🏆 时间: 2021年2月8日 - 3月8日 奖金总额: $16,000 奖项设置 这次我们提升了现金奖励力度! 请看: 1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名 - $6,000 🥈 第二名 - $3,000 🥉 第三名 - $2,000 2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名 - $3,000 🥈 第二名 - $1,500 🥉 第三名 - $500 如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金 谁可以参加? 任何开发者社区的成员均可参加,InterSystems内部员工除外。还没有账号?现在来建一个! 参赛时间安排 根据大家的反馈意见,我们做出了调整! 我们为开发留出了更多时间!所以: 🛠 2月8日- 28日: 应用程序开发和注册阶段(在此期间,您可以持续编辑自己的项目) ✅ 3月1日-7日: 投票阶段 🎉 3月8日: 宣布优胜者! 主题 💡 InterSystems IRIS 应用程序 💡 提交使用InterSystems IRIS作为后端(API或数据库)的应用程序,使用任何类型的InterSystems IRIS API或数据模型均可。 我们欢迎您进一步改进您去年在InterSystems系列竞赛中提出的申请,并将其提交参加大奖赛。当然,也欢迎您提交一份全新的申请。 应用程序应该可以在 IRIS Community Edition 或 IRIS for Health Community Edition 或 IRIS Advanced Analytics Community Edition 上运行。 应用程序应该开源并在GitHub上发布。 资源助力 示例程序: objectscript-docker-template rest-api-contest-template native-api-contest-template integratedml-demo-template PythonGateway-template iris-fhir-template iris-fullstack-template iris-interoperability-template iris-analytics-template 如何把您的APP提交给大赛: 如何在 InterSystems Open Exchange 上发布应用程序 如何把参赛APP提交给大赛 公平公正 点击查看 投票规则. 万分期待你的精彩项目! 加入大奖赛吧! ❗️ 点击此处,查看 官方竞赛术语解读. ❗️ 顶一下 IRIS 在线培训:https://learning.intersystems.com/ 在线实验室Lab:https://learning.intersystems.com/course/view.php?id=929 恭喜发财,大家踊跃报名啊! 这次我们提升了现金奖励力度,欢迎大家积极报名! 投票通道开启,欢迎参赛选手踊跃拉票啊。 https://openexchange.intersystems.com/contest/current @jingqi.liu @Weiwei.Yang @deming.xu @Botai.Zhang very good 非常棒,都是很好的应用,我会投票的。 积极投票 踊跃投票! 这些应用都是很好的解决方案! 现在这个很火爆,可惜我不会,我也要学习编程了 可以看到这么多优秀的应用,很棒👍
文章
姚 鑫 · 二月 28, 2021

第一章 InterSystems SQL简介

# 第一章 InterSystems SQL简介 InterSystems SQL提供对InterSystems IRIS®Data Platform数据库中存储的数据的无懈可击的标准关系访问。 InterSystems SQL提供以下优势: - 高性能和可扩展性-InterSystems SQL提供优于其他关系数据库产品的性能和可扩展性。此外,InterSystems SQL可以在各种硬件和操作系统上运行;从笔记本电脑到高端多CPU系统。 - 与InterSystems IRIS对象技术集成-InterSystems SQL与InterSystems IRIS Object技术紧密集成。可以混合使用关系访问和对象访问数据,而不会牺牲任何一种方法的性能。 - 维护成本低-与其他关系数据库不同,InterSystems IRIS应用程序不需要在已部署的应用程序中重建索引和压缩表格。 - 支持标准SQL查询-InterSystems SQL支持SQL-92标准语法和命令。在大多数情况下,可以毫不费力地将现有关系应用程序迁移到InterSystems IRIS,并自动利用InterSystems IRIS更高的性能和对象功能。 可以将InterSystems SQL用于多种目的,包括: - 基于对象和基于Web的应用程序-可以在InterSystems IRIS对象和Web Server Page应用程序中使用SQL查询来执行强大的数据库操作,如查找和搜索。 - 在线事务处理-InterSystems SQL为INSERT和UPDATE操作以及事务处理应用程序中常见的查询类型提供了出色的性能。 - 商业智能和数据仓库-InterSystems IRIS多维数据库引擎和位图索引技术的结合使其成为数据仓库式应用程序的最佳选择。 - 即时查询和报告-可以使用InterSystems SQL附带的功能齐全的ODBC和JDBC驱动程序连接到流行的报告和查询工具。 - 企业应用程序集成-InterSystems SQL Gateway使能够无缝地通过SQL访问ODBC或JDBC兼容的外部关系数据库中存储的数据。这使得在InterSystems IRIS应用程序中集成来自各种来源的数据变得容易。 # 架构 InterSystems SQL的核心由以下组件组成: - 统一数据字典-存储为一系列类定义的所有元信息的存储库。InterSystems IRIS自动为统一字典中存储的每个持久类创建关系访问(表)。 - SQL处理器和优化器-一组程序,用于解析和分析SQL查询,确定给定查询的最佳搜索策略(使用复杂的基于成本的优化器),并生成执行查询的代码。 - InterSystems SQL Server-一组InterSystems IRIS服务器进程,负责与InterSystems ODBC和JDBC驱动程序的所有通信。它还管理频繁使用的查询的高速缓存;当同一查询被多次执行时,可以从查询高速缓存中检索其执行计划,而不必由优化器再次处理。 ## 特点 InterSystems SQL包括一整套标准的关系型功能。这些措施包括: - 定义表和视图(DDL或数据定义语言)的能力。 - 对表和视图(DML或数据操作语言)执行查询的能力。 - 能够执行事务,包括插入、更新和删除操作。执行并发操作时,InterSystems SQL使用行级锁。 - 为更高效的查询定义和使用索引的能力。 - 能够使用各种数据类型,包括用户定义的类型。 - 定义用户和角色并为其分配权限的能力。 - 定义外键和其他完整性约束的能力。 - 定义INSERT、UPDATE和DELETE触发器的能力。 - 定义和执行存储过程的能力。 - 能够以不同的格式返回数据:用于客户端访问的ODBC模式;用于在基于服务器的应用程序中使用的显示模式。 ## 符合SQL-92 SQL-92标准在算术运算符优先级方面是不精确的;关于这一问题的假设因SQL实现而异。InterSystems SQL支持将系统配置为以下任一系统范围的SQL算术运算符优先级替代方案: - InterSystems SQL可以配置为严格按照从左到右的顺序解析算术表达式,没有运算符优先级。这与ObjectScript中使用的约定相同。因此,3+3*5=30。可以使用括号来强制执行所需的优先顺序。因此,3+(3*5)=18。 - InterSystems SQL可以配置为使用ANSI优先级分析算术表达式,这为乘法和除法运算符提供了比加法、减法和串联运算符更高的优先级。因此,3+3*5=18。如果需要,可以使用括号覆盖此优先级。因此,(3+3)*5=30。 SQL运算符优先级的默认值取决于InterSystems IRIS版本。 InterSystems SQL支持完整的入门级SQL-92标准,但有以下例外: - 不支持向表定义添加附加的CHECK约束。 - 不支持SERIALIZABLE(序列化)隔离级别。 - 分隔标识符不区分大小写;标准规定它们应该区分大小写。 - 在HAVING子句中包含的子查询中,应该能够引用该HAVING子句中“可用”的聚合。这不受支持。 ## 拓展 - InterSystems SQL支持许多有用的扩展。其中许多都与InterSystems IRIS提供对数据的同步对象和关系访问这一事实有关。 其中一些扩展包括: - 支持用户可定义的数据类型和函数。 - 以下对象引用的特殊语法。 - 支持子类化和继承。 - 支持对存储在其他数据库中的外部表进行查询。 - 用于控制表的存储结构以实现最高性能的多种机制。 ## 互操作性 - InterSystems SQL支持多种与其他应用程序和软件工具互操作的方法。 ## JDBC InterSystems IRIS包括一个符合标准的第4级JDBC客户机(全部是纯Java代码)。 InterSystems JDBC驱动程序提供以下特性: - 高性能 - 纯JAVA代码实现 - UNICODE支持 - 线程安全 可以将InterSystems JDBC与任何支持JDBC的工具、应用程序或开发环境一起使用。 ## ODBC InterSystems SQL的c语言调用级接口是ODBC。与其他数据库产品不同,InterSystems ODBC驱动程序是一个本机驱动程序——它不是构建在任何其他专有接口之上的。 InterSystems ODBC驱动程序提供以下功能: - 高性能 - 可移植性 - 原生Unicode支持 - 线程安全 可以将InterSystems ODBC与支持ODBC的任何工具,应用程序或开发环境一起使用。 ## 嵌入式SQL 在ObjectScript中,InterSystems SQL支持嵌入式SQL: **将SQL语句放置在方法(或其他代码)主体中的能力。使用嵌入式SQL,可以查询单个记录,或定义一个游标,然后使用该游标查询多个记录。嵌入式SQL已编译。默认情况下,它是在第一次执行(运行时)时进行编译的,而不是在包含它的例程进行编译时进行的。因此,在运行时检查SQLCODE错误很重要。** 还可以与包含嵌入式SQL的ObjectScript例程同时编译嵌入式SQL。 与InterSystems IRIS的对象访问功能结合使用时,嵌入式SQL的功能非常强大。例如,以下方法查找具有给定Name值的记录的RowID: ``` /// w ##class(PHA.TEST.SQL).FindByName("姚鑫") ClassMethod FindByName(fullname As %String) { &sql(SELECT %ID INTO :id FROM Sample.Person WHERE Name = :fullname) IF SQLCODE < 0 { SET baderr="SQLCODE ERROR:"_SQLCODE_" "_%msg RETURN baderr } ELSEIF SQLCODE = 100 { SET nodata="Query returns no data" RETURN nodata } RETURN "RowID="_id } ``` ``` DHC-APP>w ##class(PHA.TEST.SQL).FindByName("姚鑫") RowID=6 ``` 注意: 如果 Name 查处多条的话 id为查询的第一条数据 指定倒序,为最后一条。 ``` &sql(SELECT %ID INTO :id FROM Sample.Person WHERE Name = :fullname order by ID desc) ``` ``` DHC-APP>w ##class(PHA.TEST.SQL).FindByName("姚鑫") RowID=14 ``` ![image](/sites/default/files/inline/images/tu_pian__0.png) # 动态SQL 作为其标准库的一部分,InterSystems IRIS提供了一个%SQL.Statement类,可以使用它来执行动态(即在运行时定义的)SQL语句。可以在ObjectScript方法中使用动态SQL。例如,下面的方法查询指定数量的21世纪出生的人。该查询选择1999年12月31日之后出生的所有人,按出生日期对所选记录进行排序,然后选择前x条记录: ``` /// w ##class(PHA.TEST.SQL).Born21stC("姚鑫") ClassMethod Born21stC(x) { /// w ##class(PHA.TEST.SQL).Born21stC("1") ClassMethod Born21stC(x) { SET myquery=2 SET myquery(1) = "SELECT TOP ? Name,%EXTERNAL(DOB) FROM Sample.Person " SET myquery(2) = "WHERE DOB > 58073 ORDER BY DOB" SET tStatement = ##class(%SQL.Statement).%New() SET qStatus = tStatement.%Prepare(.myquery) IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT} SET rset = tStatement.%Execute(x) DO rset.%Display() WRITE !,"End of data" q "" } ``` ``` DHC-APP>w ##class(PHA.TEST.SQL).Born21stC("2") Name Expression_2 Ingrahm,Susan N. 02/10/2001 Goldman,Will H. 09/22/2002 2 Rows(s) Affected End of data ``` 准备查询时,该查询的优化版本将存储为缓存查询。该缓存查询被执行用于查询的后续调用,从而避免了每次执行查询时重新优化查询的开销。 ## 限制 请注意InterSystems SQL的以下限制: NLS可用于为单个全局变量以及当前运行的进程中的局部变量指定特定国家区域设置行为的$ORDER行为。InterSystems SQL可以在任何国家语言环境中使用和良好地工作。然而,InterSystems SQL当前的一个限制是,对于任何特定进程,它引用的所有相关全局变量都必须使用与当前进程区域设置相同的国家区域设置。 文章写得非常棒!学习! 学习到新知识sql动态查询,感谢!
文章
姚 鑫 · 三月 1, 2021

第二章 InterSystems SQL基础

# 第二章 InterSystems SQL基础 本章概述了InterSystems SQL的特性,特别是那些SQL标准未涵盖的特性,或者与InterSystems IRIS®数据平台统一数据架构相关的特性。 本教程假定读者具备SQL知识,并不是为介绍SQL概念或语法而设计的。 本章讨论以下主题: - 表 - 查询 - 权限 - 数据显示选项 - 数据排序类型 - 执行SQL # 表 在InterSystems SQL中,数据显示在表中。每个表都包含许多列。一个表可以包含零个或多个数据值行。以下术语大体上等效: 数据术语 | 关系数据库术语| InterSystems IRIS术语 ---|---|--- 数据库 | 架构| 包 数据库 | 表 | persistent class(持久类) 字段 | 列 | 属性 记录 | 行 | 表有两种基本类型:基表(包含数据,通常简称为表)和视图(基于一个或多个表提供逻辑视图)。 ## 模式与架构 SQL模式提供了一种将相关表,视图,存储过程和缓存查询的集合进行分组的方法。模式的使用有助于防止表级别的命名冲突,因为表,视图或存储过程的名称在其模式内必须唯一。应用程序可以在多个架构中指定表。 SQL模式与持久性类包相对应。通常,模式与其相应的程序包具有相同的名称,但是由于不同的模式命名约定或故意指定了不同的名称,因此这些名称可能有所不同。模式到程序包的映射在SQL到类名的转换中有进一步描述。 **模式是在特定的名称空间中定义的。模式名称在其名称空间内必须是唯一的。将第一个项目分配给它时,会自动创建一个模式(及其对应的程序包),从中删除最后一个项目时,会自动将其删除。** 可以指定一个限定或不限定的SQL名称,限定名称指定模式:schema.name。 非限定名不指定模式名。 如果不指定模式,InterSystems IRIS将提供如下模式: - 对于DDL操作,InterSystems IRIS使用系统范围的默认架构名称。此默认值可配置。它适用于所有名称空间。 - 对于DML操作,InterSystems IRIS可以使用用户提供的模式搜索路径或系统范围内的默认模式名称。在动态SQL,嵌入式SQL和SQL Shell中,使用了不同的技术来提供模式搜索路径。 DML(data manipulation language): 它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 DDL(data definition language): DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用 DCL(Data Control Language): 是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL 要查看名称空间内的所有现有模式,请执行以下操作: 1. 在管理门户中,选择“系统资源管理器”,然后选择“ SQL”。使用页面顶部的Switch选项选择一个名称空间;这将显示可用名称空间的列表。选择一个名称空间。 ![image](/sites/default/files/inline/images/tu_pian__1.png) ![image](/sites/default/files/inline/images/2_12.png) 2. 选择屏幕左侧的Schema下拉列表。这将显示当前名称空间中的架构列表。从该列表中选择一个模式;所选名称将出现在“模式”框中。 ![image](/sites/default/files/inline/images/3_10.png) 3. 如果有数据下拉列表允许选择表,视图,过程或缓存的查询,或所有属于模式的所有这些。设置此选项后,单击三角形以查看项目列表。如果没有项目,则单击三角形无效。 ![image](/sites/default/files/inline/images/4_4.png) # 查询 在InterSystems SQL中,可以通过查询查看和修改表中的数据。粗略地说,查询有两种形式:查询数据(SELECT语句)和修改数据(INSERT,UPDATE和DELETE语句)。 可以通过多种方式使用SQL查询: - 在ObjectScript中使用嵌入式SQL。 - 在ObjectScript中使用动态SQL。 - 调用使用CREATE PROCEDURE或CREATE QUERY创建的存储过程。 - 使用类查询。 - 使用来自各种其他环境的ODBC或JDBC接口。 # 权限 InterSystems SQL提供了一种通过权限来限制对表、视图等的访问的方法。 # 数据显示选项 InterSystems SQL使用SelectMode选项来指定如何显示或存储数据。 可用的选项有Logical、Display和ODBC。 数据在内部以逻辑模式存储,并且可以在这些模式中的任何一种中显示。 通过使用`LogicalToDisplay()`、`LogicalToODBC()`、`DisplayToLogical()`和`odbcological()`方法,每个数据类型类都可以在内部逻辑格式和显示格式或ODBC格式之间进行转换。 当显示SQL SelectMode时,将应用LogicalToDisplay转换,并对返回值进行格式化以便显示。 默认的SQL SelectMode是逻辑的; 因此,默认情况下返回值以存储格式显示。 SelectMode影响查询结果集数据显示的格式,SelectMode还影响应该提供数据值的格式,例如在WHERE子句中。 InterSystems IRIS根据存储模式和指定的SelectMode选择合适的转换方法。 所提供的数据值与SelectMode之间的不匹配可能导致错误或错误的结果。 例如,如果`DOB`是一个以`$HOROLOG`逻辑格式存储的日期,并且WHERE子句指定`DOB > 2000-01-01 `(ODBC格式),则SelectMode = ODBC返回预期的结果。 `SelectMode = Display`生成`SQLCODE -146`,无法将日期输入转换为有效的逻辑日期值。 `SelectMode =Logic`将 `2000-01-01`解析为逻辑日期值,并返回零行。 对于大多数数据类型,三种SelectMode模式返回相同的结果。 以下数据类型受SelectMode选项影响: - 日期,时间和时间戳数据类型。 InterSystems SQL支持多种日期,时间和时间戳数据类型(`%Library.Date`,`%Library.Time`,`%Library.PosixTime`,`%Library.TimeStamp`和`%MV.Date`)。除`%Library.TimeStamp`外,这些数据类型对逻辑,显示和ODBC模式使用不同的表示形式。在其中的几种数据类型中,InterSystems IRIS以`$HOROLOG`格式存储日期。此逻辑模式内部表示包括从任意起始日期(1840年12月31日)起的天数的整数,逗号分隔符以及从当天午夜开始的秒数的整数。 InterSystems IRIS将`%PosixTime`时间戳存储为编码的64位带符号整数。在“显示”模式下,日期和时间通常以数据类型的FORMAT参数指定的格式显示,或者当前语言环境的日期和时间格式默认为`%SYS.NLS.Format`。美国语言环境的默认值为`DD / MM / YYYY hh:mm:ss`。在ODBC模式下,日期和时间始终表示为`YYYY-MM-DD hh:mm:ss.fff`。 `%Library.TimeStamp`数据类型还将这种ODBC格式用于逻辑和显示模式。 - `%LIST`数据类型。InterSystems IRIS逻辑模式使用两个非打印字符存储列表,这两个字符出现在列表中的第一个项目之前,并显示为列表项目之间的分隔符。在ODBC SelectMode中,列表项显示时列表项之间带有逗号分隔符。在Display SelectMode中,列表项显示时,列表项之间有空格分隔符。 - 指定`VALUELIST`和`DISPLAYLIST`的数据类型。如果处于显示模式,并且在字段具有`DISPLAYLIST`的表中插入一个值,则输入的显示值必须与`DISPLAYLIST`中的一项完全匹配。 - 空字符串和空BLOB(流字段)。在逻辑模式下,空字符串和BLOB由非显示字符`$CHAR(0)`表示。在显示模式下,它们由空字符串(“”)表示。 SQL SelectMode可以指定如下: - 对于当前进程,请使用`$SYSTEM.SQL.SetSelectMode()`。 - 对于InterSystems SQL Shell会话,请使用SET SELECTMODE命令。 - 使用“显示模式”下拉列表,从管理门户“执行查询”用户界面(系统资源管理器,SQL)获得查询结果集。 - 对于动态SQL `%SQL.Statement`实例,请使用`%SelectMode`属性。 - 对于嵌入式SQL,请使用ObjectScript `#SQLCompile` Select预处理器指令设置。该伪指令允许使用第四个值Runtime,它将选择模式设置为RuntimeMode属性设置为:逻辑,显示或ODBC。 RuntimeMode的默认值为Logical。 - 对于使用SELECTMODE关键字的SQL命令CREATE QUERY,CREATE METHOD,CREATE PROCEDURE和CREATE FUNCTION。 - 通过使用`%EXTERNAL`,`%INTERNAL`和`%ODBCOUT`函数在SQL查询中的单个列。 # 数据排序 Collation种类决定了值的排序和比较方式,它是InterSystems SQL和InterSystems IRIS对象的一部分。 **可以指定排序规则类型作为字段/属性保护的一部分。除非另有说明,否则字符串字段/属性默认为命名空间默认排序规则。默认情况下,字符串的命名空间默认排序规则是SQLUPPER。 SQLUPPER排序规则将字符串转换为大写,以便排序和比较。因此,除非另有说明,字符串排序和比较不区分大小写。** 可以指定排序规则类型作为索引保护的一部分,或者使用索引字段的排序规则类型。 通过将排序函数应用于字段名,SQL查询可以覆盖未保护的字段/属性排序规则类型。ORDER BY子句指定查询的结果集序列;如果指定的字符串字段被保护为SQLUPPER,查询结果顺序不区分大小写。 # 执行SQL InterSystems IRIS支持多种方法来编写和执行SQL代码。其中包括: - 嵌入式SQL:嵌入在ObjectScript代码中的SQL代码。 - 动态SQL:使用`%SQL.Statement`类从ObjectScript中执行的SQL代码。 - `Execute()`方法:使用`%SYSTEM.SQL`类的`Execute()`方法执行SQL代码。 - 包含SQL代码的存储过程,使用CREATE PROCEDURE或CREATE Query创建。 - SQL Shell:从终端界面执行的SQL语句。 - 执行查询界面:从管理门户执行的SQL语句。 可以使用InterSystems IRIS对象(类和方法)执行以下操作: - 持久性类(SQL表)。 - 定义索引。 - 定义并使用类查询。 关于动态SQL能再详细说说吗? 实用帖,非常好的学习知识,感谢!
文章
Qiao Peng · 三月 5, 2021

InterSystems IRIS 元素周期表

InterSystems IRIS 元素周期表 PDF 版本: GIT 源: InterSystems IRIS 是一个具有许多功能的数据平台。 这些功能和相关的 IRIS 主题都体现在元素周期表中。
文章
Michael Lei · 五月 17, 2022

InterSystems 最佳实践系列之使用Doker和配置文件模版来部署Sharded 集群

在这篇文章中,我们将使用docker和 参数配置文件模版 这一新特性来运行IRIS集群且轻松配置好。 在 UNIX® 和 Linux 上,您可以使用声明式参数配置合并文件来修改默认的 iris.cpf。合并文件是一个部分 CPF,在实例启动时为任何数量的参数设置所需的值。CPF 合并操作对每个实例只起一次作用。 我们的集群架构非常简单,它将由一个主节点(Node1)和两个数据节点(检查所有可用角色)组成。不幸的是,docker-compose不能部署到几个服务器上(尽管它可以部署到远程主机上),所以这对本地开发分片的数据模型、测试等很有用。如果是生产的InterSystems IRIS集群部署,你应该使用ICM云管理器或IKO K8S调度器。 Docker-compose.yml 我们从docker-compose 配置开始: docker-compose.yml version: '3.7' services: iris1: image: containers.intersystems.com/intersystems/iris:2020.3.0.221.0 init: true command: --key /ISC/iris.key hostname: iris1 environment: - ISC_DATA_DIRECTORY=/ISC/iris.sys.d/sys1 - ISC_CPF_MERGE_FILE=/ISC/CPF2merge-master-instance.conf volumes: - ./:/ISC:delegated ports: - 9011:1972 - 9012:52773 iris2: image: containers.intersystems.com/intersystems/iris:2020.3.0.221.0 command: --key /ISC/iris.key --before 'sleep 60' init: true hostname: iris2 environment: - ISC_DATA_DIRECTORY=/ISC/iris.sys.d/sys2 - ISC_CPF_MERGE_FILE=/ISC/CPF2merge-data-instance.conf volumes: - ./:/ISC:delegated depends_on: - iris1 ports: - 9021:1972 - 9022:52773 iris3: image: containers.intersystems.com/intersystems/iris:2020.3.0.221.0 command: --key /ISC/iris.key --before 'sleep 60' init: true hostname: iris3 environment: - ISC_DATA_DIRECTORY=/ISC/iris.sys.d/sys3 - ISC_CPF_MERGE_FILE=/ISC/CPF2merge-data-instance.conf volumes: - ./:/ISC:delegated depends_on: - iris1 ports: - 9031:1972 - 9032:52773 正如你所看到的,我们正在运行一个默认的intersystems/iris:2020.3.0.221.0镜像,提供License Key(必须支持Sharding),使用持久化的%SYS特性持久化数据,并提供ISC_CPF_MERGE_FILE,指向我们的合并文件(主节点和数据节点的文件不同)。此外,数据节点的启动晚了一分钟来让主节点先启动,这是个非常保守的估计,在一个正常的硬件上,启动时间最多几秒钟。 集群配置在CPF合并文件中,让我们来看看 Cluster configuration happens at CPF merge files, let's check them out CPF2merge-data-instance.conf [Startup] PasswordHash=FBFE8593AEFA510C27FD184738D6E865A441DE98,u4ocm4qh ShardRole=node1 [config] MaxServerConn=64 MaxServers=64 globals=0,0,400,0,0,0 errlog=1000 routines=32 gmheap=256000 locksiz=1179648 发生了什么情况? 在[Startup] 部分,我们通过为我们的集群分配主节点角色来启用分片。在[config]中,我们将服务器扩大一些,允许更多的缓存和连接。就这么简单! CPF2merge-data-instance.conf [Startup] ShardClusterURL=IRIS://iris1:1972/IRISCLUSTER ShardRole=DATA 针对数据节点, 我们需要提供主节点和节点角色的URL. 试一下 试试这个repository 或者运行这段代码: git clone https://github.com/intersystems-ru/iris-container-recipes.git cd iris-container-recipes cd cluster // copy iris.key in cluster folder docker-compose up -d 启动InterSystems IRIS集群后你可以从 浏览器 访问. 用户名/密码 is: _SYSTEM/SYS. 结论 合并CPF文件 是一个很好用而简单的工具来配置InterSystems IRIS的实例。 感谢@Luca.Ravazzolo提供的代码并回答了我所有的问题。
文章
Lucy Ma · 五月 18, 2022

InterSystems IRIS商业智能:选择性构建

什么是选择性构建? 选择性构建是InterSystems IRIS (2020.1及以后)商业智能的一个功能。选择性构建允许仅构建模型中的指定元素,并且保持模型可以正常使用。 选择性构建有哪些特性? 在了解选择性构建的细节之前,一个简单的汇总在介绍关于在构建一个标准模型的不同阶段是重要的。这里列出了标准模型构建的过程阶段: 1)删除模型中已存在的数据 2)增添模型需要的全量数据 3)构建所有的索引 现在我们已经熟悉一个标准模型构建的过程,我们可以理解选择性构建的优势。在标准构建过程中,模型必须被停用,因为第一步是需要删除掉所有的已存在数据,接着再增添全量数据。这种情况不会发生在选择性构建中。选择性构建仅仅选择指定的模型元素停用,然后更新相应的数据到这些元素中。这意味着已经存在的数据并不会被删除。既然已经存在数据不会被删除,模型则不需要被停用。那些被选择构建的元素会被停用,表示如果用户想要查询这些停用的元素,他们会看到报错信息。 选择性构建的使用场景? 选择性构建是一种很好的方式用于更新数据模型,而不需要将整个模型停用来延长构建时间。基于模型的大小,一个模型有可能需要几个小时甚至几天来做全量的构建。如此长的构建时间仅仅为了增加一条新的维度减弱了频繁更改模型的灵活性。 如何使用? 从UI界面 在架构中,任何更改的元素都会被自动追踪。当你试图从UI界面构建模型,弹出的对话框会提供一个选项叫做选择性构建。这个选项是默认的,无论任何模型中的元素被更改需要重新构建。当然,如果你更想构建全部模型,也可以在这个界面选择。 构建模型接口 在构建模型的接口中有一个新的参数。这个参数在文档中被描述为:“pFactList是一个特殊属性的列表,存在于模型的事实表类中。如果pFactList被设定,构建过程会仅仅更新在这个事实列表中的行。这个列表可以用逗号分割或者用 $LB的格式。这个特殊的事实表更新时会被单独标记不可用于被搜索,以及与其相关的维度也不可用,否则的话则会收到报错提示。” 我会建议使用UI界面来部署模型的更改,接口方式用于部署关于系统层面的变更。 学习更多关于选择性构建,请参考文档。
公告
Michael Lei · 四月 29, 2022

InterSystems 2022年度编程大奖赛投票开始!

年度InterSystems IRIS开发者大赛来了,我们特别兴奋能够邀请大家参加我们今年的年度大奖赛,利用InterSystems IRIS数据平台创建开源解决方案! 🏆 InterSystems2022年度编程大奖赛 🏆 时间: 2021年5月9日 - 6月5日(美东时间) 总奖金超过$22,000美金,比去年提高37%!!! 主题 InterSystems 编程大奖赛是我们的年度编程大赛,旨在寻找使用InterSystems IRIS的最佳应用。 我们欢迎任何主题的申请! 提交任何使用InterSystems IRIS作为后端(API或数据库)的应用程序,以及任何类型的InterSystems IRIS API或数据模型。 我们欢迎您改进您去年在InterSystems竞赛系列中展示的应用程序,并提交给大奖赛。也欢迎您提交一个100%的新应用。 要求: 参赛作品申请:新加入Open Exchange的应用程序或现有的应用程序,但要有明显的改进。我们的团队将审核所有参赛申请后决定是否批准参赛. 该应用应在IRIS社区版或IRIS for Health社区版或IRIS高级分析社区版上运行. 该应用程序应是开源的,并在GitHub上发布 应用程序的README文件应该是英文的,包含安装步骤,并包含视频演示或/和应用程序如何工作的描述。 每位开发者最多可提交三个应用。 奖项设置(2022年总奖金比去年增长37.5%!!!): 1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名- $7,000 🥈 第二名- $5,000 🥉 第三名- $3,000 🌟 第四到二十名- $100 2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名- $3,000 🥈 第二名- $2,000 🥉 第三名- $1,000 ✨ 所有获奖者都将授予Global Masters奖章! 如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金。 重要参赛时间安排 🛠 5月9日-29日(美东时间): 应用程序开发和注册阶段(在此期间,您可以持续编辑自己的项目) ✅ 5月30日(美东时间): 开启投票阶段(在此期间,您可以持续编辑自己的项目) ✅ 6月5日(美东时间): 投票截止 谁能参加? 除了InterSystems员工以外的所有社区成员. 快来加入吧! 开发者可以组队参加,每队2-5人。 不要忘记在您的应用程序的README中标明你的团队成员--开发者社区用户资料。 您可以使用的资源 ✓ 如何使用 InterSystems IRIS (初学者): Build a Server-Side Application with InterSystems IRIS Learning Path for beginners ✓ 初学者如何使用 ObjectScript Package Manager (ZPM): How to Build, Test and Publish ZPM Package with REST Application for InterSystems IRIS Package First Development Approach with InterSystems IRIS and ZPM 代码示例: objectscript-docker-template rest-api-contest-template native-api-contest-template integratedml-demo-template PythonGateway-template iris-fhir-template iris-fullstack-template iris-interoperability-template iris-analytics-template 如何把您的APP提交给大赛: 如何在 InterSystems Open Exchange 上发布应用程序 如何把参赛APP提交给大赛 需要帮助吗? 欢迎在本帖下留言或联系您熟悉的InterSystems员工。 万分期待你的精彩项目!祝大家好运 👍 参加本次比赛,即表示您同意这里规定的比赛条款。请在进行比赛前仔细阅读这些条款。
公告
jieliang liu · 四月 18, 2022

[视频] InterSystems Globals与灵活的数据建模

各位开发者们好, InterSystems IRIS 数据平台的最大特点之一是它允许您创建自己的自定义,您可以使用InterSystems IRIS 中支持的所有其他模型,例如对象和关系结构,而无需创建任何自定义结构。 ⏯ InterSystems Globals与灵活的数据建模 Globals 请各位开发者关注我们的Bilibili 频道InterSystems Bilibili 主页!
文章
Qiao Peng · 四月 11, 2022

InterSystems 数据平台与三级等保 - 第一篇

数据平台不仅要安全,还要合规,三级等保是我们要符合的主要安全规范。InterSystems的数据平台和集成平台产品都和三级等保有关。如果没有正确配置它们的安全选项,就会影响到整个系统的安全,影响到合规性。 在生产环境上,如何配置安全的InterSystems的数据平台,并达到三级等保的要求? 这个系列文章,针对InterSystems 数据平台的安全架构,围绕对三级等保的合规性展开,介绍如何配置出一个安全、合规的数据平台。 注:本文提到的InterSystems的数据平台,包括Caché数据库、Ensemble集成平台、HealthConnect医疗版集成平台和InterSystems IRIS数据平台。 三级等保的要求 三级等保要求 对数据平台的要求 身份鉴别 确保用户身份是真实、准确的 访问控制 控制:谁、以什么方式、从什么设备可以访问什么数据和功能? 入侵防范 防范静态数据、传输中的数据、日志和备份中的数据被入侵 恶意代码防范 防止恶意代码被植入和执行,例如SQL注入 可信验证 数据完整性 保证数据完整性和一致性的能力 数据备份恢复 对数据的备份与恢复能力和策略 InterSystems数据平台安全架构 InterSystems数据平台提供了一个完善的安全架构,用以保护从接入到数据保存的各个层面的数据安全: InterSystems数据平台提供丰富的安全相关特性,用以保障系统安全性和合规性: 我们按数据的流向逐一展开,看看应该如何加强InterSystems数据平台的安全。 1. InterSystems数据平台连接通道安全 客户端可以使用多种技术连接到InterSystems数据平台,包括ODBC/JDBC、Java、.net、TCP、Telnet、HTTP、SOAP、REST等。除了客户端的连接,InterSystems数据平台之间也有很多连接通道,例如高可用镜像成员之间、数据平台和Web网关之间… 这些连接通道都应该考虑使用SSL/TLS进行通讯加密,从而保护数据的安全和一致性。 1.1配置InterSystems数据平台的超级服务器接入通道加密 除了通过HTTP、SOAP、REST之外的客户端,其它的客户端都连接到InterSystems数据平台的超级服务器。InterSystems数据平台在系统范围内使用SSL/TLS协议为超级服务器端口通道加密。 配置步骤如下: 在管理门户中,通过路径 系统 > 安全管理 > SSL/TLS 配置,建立名为%SuperServer的SSL/TLS配置项。参考文档 在管理门户中,通过路径 系统 > 安全管理 > SSL/TLS 配置,在超级服务器SSL/TLS支持 选项上选中“要求”。它的三个选项分别为: 禁用(默认选项)- 拒绝使用TLS的客户端连接 启用 - 允许使用TLS的客户端连接,但不必要 要求 – 仅接受使用TLS的客户端连接 如果Telnet也要通过TLS加密传输,将上面配置的基础上,再建立一个名为%TELNET/SSL的SSL/TLS配置项,然后将上图的Telnet server SSL/TLS support 设置为“要求”。具体配置 1.2 配置客户端使用SSL/TLS连接到InterSystems数据平台的超级服务器 不同的客户端技术配置SSL/TLS的方式不同,具体的配置详见: Java .net ODBC/Studio/Windows Terminal Windows配置 这里以ODBC为例,看看Windows客户端上ODBC设置的步骤: 1. 在Windows客户端上下载IRIS服务器上的CA证书文件,并保存在指定目录。例如:c:\InterSystems\certificates\certificateSQLaaS.pem 2. 在Windows客户端上编辑并保存C:\Program Files (x86)\Common Files\InterSystems\IRIS\SSLDefs.ini,其中[IRISServer]是你起的SSL/TLS配置名,后面的Address和Port是 InterSystems数据平台的服务器地址和超级服务器端口号。[TLSConfig]是SSL/TLS的配置项,注意其中的CAfile是第一步得到的CA证书文件路径。 [IRISServer] Address=172.168.3.10 Port=1972 SSLConfig=TLSConfig [TLSConfig] TLSMinVersion=16 TLSMaxVersion=32 CipherList=ALL:!aNULL:!eNULL:!EXP:!SSLv2 Ciphersuites=TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256 KeyType=2 VerifyPeer=1 Password= CAfile=c:\InterSystems\certificates\certificateSQLaaS.pem 3. 配置Windows的ODBC DSN,选中“Password with SSL/TLS", 并在“SSL/TLS Server Name”中填写SSLDefs.ini中特定的配置名,例如:IRISServer 之后ODBC客户端就可以使用这个DSN通过TLS加密传输连接到InterSystems数据平台了。 1.3 安全建议 虽然不是三级等保必须的,建议配置和开启InterSystems数据平台的超级服务器SSL/TLS连接。 2. Web服务器 InterSystems 数据平台在安装时,可以选择安装一个私有的Apache,用于访问管理门户和基于HTTP的开发、测试,例如网页应用、SOAP和RESTful API。 这个私有Apache并不是全功能的,因此不应作为生产环境的Web服务器,尤其是生产环境有基于HTTP的服务、应用或接口时。这时,应该部署独立的Web服务器和InterSystems Web网关,连接到InterSystems的数据平台。并且应该配置HTTPS,而非使用无加密的HTTP。 InterSystems的数据平台支持Apache、IIS和Nginx等Web服务器。 2.1 独立Web服务器的配置 如何配置独立的Web服务器和InterSystems Web网关,如何配置Web服务器的HTTPS?请参考这篇非常棒的社区系列文章: WebGateway系列 2.2 安全建议 生产环境上,部署独立的Web服务器,而非使用InterSystems 数据平台的私有Web服务器。 Web服务器应使用HTTPS,而非HTTP,提供Web服务。 3. 服务与接口 InterSystems数据平台提供一系列服务和接口,用于各种外部系统和技术的接入,例如常见的ODBC/JDBC的SQL客户端、开发者使用的Studio、管理员常用的Telnet。另外,InterSystems数据平台组件和实例之间的连接也是通过服务实现的,例如Web网关和InterSystems数据平台之间的连接、配置为镜像高可用的多台InterSystems数据平台之间的连接。 3.1 InterSystems数据平台的服务 下表列出了InterSystems数据平台的服务和它们服务的对象: 服务名称 描述 %Service_Bindings 控制 SQL 或对象访问方式,包括Studio、XDBC客户端、Java、C++、ActiveX %Service_CacheDirect 控制 Caché 直连访问方式 %Service_CallIn 控制使用CallIn的C/C++应用的访问 %Service_ComPort 控制从Windows系统COM端口的访问 %Service_Console 控制Windows本地服务器上 CTERM (TRM:pid) 和 Windows 控制台访问 %Service_Terminal 控制UNIX, Linux, Mac本地服务器上的控制台访问 %Service_DataCheck 控制实例间数据一致性检查DataCheck时,作为数据源的访问 %Service_DocDB 控制文档数据库的访问 %Service_ECP 控制是否ECP %Service_Login 控制通过 SYSTEM.Security.Login的登录访问 %Service_Mirror 控制镜像成员访问 %Service_Monitor 控制 SNMP 和远程监视命令 %Service_Shadow 控制此系统是否可以是shadow来源 %Service_Sharding 控制是否可以作为分片服务器访问 %Service_Telnet 控制来自于Windows 服务器的本地或远程Telnet 会话访问 %Service_CSP %Service_WebGateway %Service_CSP(Caché/Ensemble)或%Service_WebGateway(IRIS)控制通过Web网关的访问,也就是web应用 %Service_Weblink 控制旧有的WebLink应用访问 3.2 InterSystems数据平台服务的安全选项 这些向外开放的服务和接口有多种机制保护安全: 是否启用 是否是公用服务(意味着所有用户都有权限) 身份认证的方式 接入客户端的IP限制 其它特殊限制 在管理门户>系统>安全管理>服务,可以对每一项服务进行单独的安全配置: 3.3 安全建议 关闭不必要的服务。 对开启的服务,应选择安全的认证方式,不应使用“未验证”方式。 进一步限定允许接入的客户端IP地址。 4. 用户认证 用户认证是保障数据安全的核心之一。 4.1 InterSystems数据平台的用户认证机制 InterSystems数据平台支持多种用户认证机制,包括: Kerberos 基于操作系统的认证 IRIS用户名/密码 LDAP 代理认证 – 用户自定义认证 无认证 – 无需用户认证,进来的用户自动为UnknownUser 二阶段认证 它同时可以开启和使用多种用户认证,允许用户使用不同的认证方式接入数据平台。在启用多种用户认证机制时,InterSystems数据平台会以一定优先顺序来应用用户认证机制: Kerberos > 基于操作系统的认证 > IRIS用户名/密码 >无认证 LDAP > 代理认证 >无认证 4.2 用户认证方式的设置 这些用户认证方式,可以在系统层面开启或禁用,也可以在服务/接口层面进行选择。对于InterSystems数据平台提供的Web应用,例如网页应用、SOAP服务和RESTful API,还可以在Web应用层面进行用户认证方式的配置。 系统层面的配置,在管理门户>系统>安全管理>Authentication/Web Session Options ; 服务层面的配置,见3.2; 应用层面的配置,将在后面的应用安全章节详细介绍。 4.3 安全建议 系统级禁用 “无认证”,和其它不需要使用的认证方式 系统级,采用更安全的认证方式 5. 用户授权 InterSystems数据平台提供一套基于角色的权限控制机制,它可以保障细颗粒度的数据与服务安全。 5.1基于角色的权限控制机制 在这套机制下,被保护的数据与服务被称之为资产。资产可以是任何具体事物,例如数据库、服务、平台应用、管理工具,甚至可以是抽象的事物,例如工作身份、“对患者联系方式的权限”。 权限控制机制是: InterSystems数据平台定义资源,对应一个或多个资产;系统已经定义了一系列系统资源,同时用户可以自定义资源。 对资源的许可,例如读、写、使用,就是权限; 将权限分配给InterSystems数据平台定义的角色和/或用户; 用户就具有了相应的资产权限。 5.2资源的权限配置 通过管理门户>系统>安全管理>资源,管理可以创建新资源、配置已有资源的权限。 以%开头的资源是系统已经创建好的资源,例如: %Admin_* 是工作身份资源 %DB_* 是数据库资源 %Service_* 是服务资源 %Ens_* 是互操作相关的资源 其中,对资源的权限可以被设置为“公有权限”,即所有用户都有相应的权限。 5.3 安全建议 用户自定义的数据库应该设置自己独立的资源,而非使用%DB_%DEFAULT 谨慎使用公共权限 创建自己需要保护的新资源
文章
Qiao Peng · 四月 11, 2022

InterSystems 数据平台与三级等保 - 第二篇

6. 用户与角色 InterSystems 数据平台对用户和角色提供全面的管理和安全配置功能。加强数据平台的安全,需要加强对于用户和角色的管理。 6.1 用户管理 系统提供了一系列预置的用户账户,这些账户管理对应特殊的系统功能: 用户 说明 UnknownUser 匿名用户,通过“未验证”方式登录到系统的用户 _SYSTEM SQL系统管理员 SuperUser 超级用户 Administrator 安装系统的用户 Admin 系统管理员 CSPSystem Web网关管理员 IAM IAM用户 _PUBLIC 内部使用 _Ensemble 内部使用 6.1.1 系统级用户安全配置 InterSystems数据平台有一些系统级别的用户安全配置,例如密码模式、密码有效天数、无效登录限制(多少次登录失败后要禁用用户账户)、非活动限制(多少天未登录后禁用用户账户)等。这些系统级配置通过管理门户>系统>安全管理>系统范围的安全参数: 三级等保对于用户的密码强度是有要求的。弱密码只需要0.19毫秒就能被破解,而8位强密码破解需要上百年。密码强度可以通过上面配置页面的密码模式或密码验证routine来配置: 密码模式只能配置简单的密码强度约束逻辑,例如3.32ANP意思是允许3位到32位长度到密码,密码可以由字符、数字和符号组成。 密码验证routine可以配置任意复杂的密码强度约束逻辑,它通过用户自定义的密码检查逻辑进行判断。例如要求“密码必须是包括数字、大写字母和半角符号的8位以上的字符串”,可以在%SYS命名空间下编写一个routine,里面提供密码验证逻辑的方法。方法名由自己决定,它有两个固定的参数Username和Password,您只要实现密码约束逻辑:如果符合约束,返回$$$OK,否则返回相应的错误提示即可。 这里给出一个routine示例,这个%SYS下的routine名为IRISPWD,里面的CHECK方法用于判断密码合规性,它利用正则表达式判断密码是否符合“必须是包括数字、大写字母和半角符号的8位以上的字符串”的约束,违反约束时给出提示错误。 #include %occInclude CHECK(Username,Password) PUBLIC { s tValid=(Password?8.E)&&(Password?.E1.U.E)&&(Password?.E1.N.E)&&(Password?.E1.P.E) q:(tValid=0) $$$ERROR($$$GeneralError,"密码需要是包括数字、大写字母和半角符号的8位以上的字符串") q $$$OK } 然后将方法调用的名称更新到“系统范围的安全参数”中的密码验证routine中。方法调用名称是方法名^Routine名,本示例为CHECK^IRISPWD。 设置好后即可生效,但要注意它不会对旧有密码进行验证。当设置或修改用户密码后保存时,它会进行检查,对违反约束的密码设置,会报如下错误提示: 6.1.2用户管理 通过管理门户>系统>安全管理>用户,可以创建、管理用户。在这里可以执行每个用户的初始密码设置、账户启用/禁用条件,用户的角色设置、SQL权限等管理。 另外,也可以查看用户的概要信息,它会显示用户的权限列表、登录历史等信息: 注意: CSPSystem用户是CSP网关登录到InterSystms IRIS/Cache'的用户。如果需要修改它的密码,需要先在IRIS/Cache'用户管理页面修改CSPSystem的密码,然后再登录到CSP网关上修改CSP网关连接IRIS服务器的账户信息,保持二者密码一致。1. 登陆到私有Apache的CSP网关或独立安装的Web服务器的CSP网关,访问http://<IP+端口>/csp/bin/Systems/Module.cxw 2. 修改CSP网关连接IRIS服务器的账户信息: 2.1 Configuration>Default Parameters>Security>User Name 和Password2.2 Configuration>Server Access>Connection Security>User Name 和Password 6.2 角色管理 InterSystems数据平台预置了一些%开头的系统角色,例如%Developer开发者角色、%Manager系统管理员角色、%Operator系统操作员角色。 其中%All是一个特殊角色,它是超级用户角色,属于这个角色下的用户都是超级用户。因此属于这个角色的用户数量不宜过多,当然也不建议少于2个,以避免密码遗失造成无法管理系统而只能进入紧急模式。 6.3 安全建议 1.仅管理员有%All角色,尤其要确保UnknownUser没有%All角色 2.删除不需要的系统角色和系统用户 3.要求用户账号更安全的密码模式 4.设置密码错误数次后停用账号 7. 数据安全 InterSystems数据平台提供了丰富的数据安全特性,包括数据与数据库加密、数据访问控制机制。这里相当多的特性都是三级等保要求的。 7.1 数据加密 InterSystems数据平台内建多种加密算法,包括AES CBC (128, 192, 256位)、HMAC、MD5、SHA-1、SHA-512、PKCS、PBKDF2、Base64等。同时,它可以直接调用外部的Python、Java和.net算法库,实现包括国密SM算法在内的算法扩展。 它支持对全数据库加密,或仅对数据元素加密。 7.1.1 全数据库加密 全数据加密时,InterSystems数据平台使用AES加密算法,自动负责数据库数据的加解密。加密的数据库在加载时,需要向系统提供密钥。通常密钥保存在可移除的设备上,例如U盘,仅在加密数据库加载时使用,加载后就可以移除并保存在安全的地方。 InterSystems数据平台的数据库和命名空间架构让用户可以将需要加密保护的数据,例如患者基本信息数据和支付数据单独保存在一个较小的数据库中。 在全数据库加密的情况下,可以对日志、审计日志都进行加密,从而避免任何的数据泄密渠道。这样,即便数据库文件、日志文件和审计日志被盗走,没有密钥文件都无法解密数据。 创建一个新密钥文件及新的加密数据库的过程非常简单,在管理门户即可完成: 产生密钥文件。只有管理员才有权限产生密钥文件。 输入密钥文件产生路径、管理员账户、密钥文件管理密码、AES加密位数,保存时会产生用于加密的密钥文件。 注意,产生的密钥文件的管理是需要权限的 – 只有密钥管理员才可以激活该密钥文件并使用它进行数据库加密。在密钥文件产生后,尽快加入多个可以管理该密钥的管理员,并为他们设置不同的密钥密码,以避免一个密钥管理员账户失效。 密钥文件产生后,你就可以将其拷贝到安全的位置,并将原始产生的文件删除。如果你有多个密钥,应记住密钥ID (如下图的0535458F-A895-4915-BADF-2C257602880D)和密钥文件、密码的关系。 激活密钥文件 在InterSystems数据平台实例上激活密钥,才能使用它进行数据库加解密。只有密钥管理员,使用密钥文件的密码才能激活密钥。 每个实例可以激活多个密钥,因为你可能有使用不同密钥加密后的数据库文件。可以设置某个密钥为默认密钥,新产生的加密数据库会使用默认密钥加密;同时可以设置某个密钥文件为默认的Journal日志密钥,新的Journal日志会使用默认Journal密钥加密。 这里还可以设置密钥使用的方式:“交互”或“无人参与”。 “无人参与”需要将密钥文件保存在一个InterSystems数据平台启动时可以访问到的固定路径上,因此不推荐使用。“交互”方式下,InterSystems数据平台会在启动和加载加密数据库时向管理员询问密钥位置,因此更加安全。 创建加密的数据库: 在数据库创建过程中,选择加密数据库。这样InterSystems数据平台会使用当前默认的密钥进行加密。 现在你就有了一个加密的数据库了,里面的任何数据都是被加密的。即便数据库文件被copy走,只要没有密钥文件,这个数据库就无法被加载或解密其中的数据。 在今后的InterSystems数据库平台的启动过程中,都将要求输入加密密钥文件的完整路径、密钥管理员账户和密钥文件密码: 如果要对之前未加密的数据库加密、或者将加密数据库重新部署为不加密的数据库、或者为加密数据库更换加密密钥,这些操作需要通过^EncryptionKey 管理工具完成,而不能在管理门户中完成。参见文档 7.1.2 数据元素加密 除了全数据库加密,用户也可以选择通过代码控制仅对特定数据元素加密,因此它可以控制非常细颗粒度的加密策略。 InterSystems数据平台提供系统类%SYSTEM.Encryption,里面有密钥创建和管理、加密解密的方法。用户开发的程序可以使用这些方法进行密钥管理和加解密工作。 如何使用的文档在这里。 7.2 数据访问控制 InterSystems数据平台提供多个层面的数据访问控制机制。包括: 数据库层面的访问权限控制,即数据库读、写权限控制 SQL层面的访问权限控制,包括 SQL操作的权限,例如创建表和视图的权限 对表、视图级别的访问权限 对存储过程的执行权限 行级安全 – 例如每个医生只能看自己的出诊记录 列级安全 – 例如医生角色可以看到患者表中除了患者支付卡号列之外的其它数据 这些数据访问控制机制可以自由组合,满足严格的数据访问控制。 7.3 安全建议 对敏感数据进行全数据库加密,并保存好密钥文件和密钥文件密码 合理的数据读写权限 必要时,添加行级和列级安全
公告
Claire Zheng · 四月 11, 2022

InterSystems Globals开发者竞赛获奖者名单出炉!来看看这优秀的应用吧!

Hi开发者们, 我们非常高兴地向大家宣布此次 InterSystems Globals开发者竞赛的获奖者! 第19届编程大赛的优胜者名单如下: 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名,奖金 $4,000 获奖项目 global-mindmap 开发者 @Yuri.Gomes 🥈 第二名,奖金 $2,000 获奖项目 globals-tool 开发者 @Dmitry.Maslennikov 🥉 第三名,奖金 $1,000 获奖项目 iris-globals-graphDB 开发者 @Muhammad.Waseem 更多获奖者: 🏅 奖金$100 ,获奖项目 python-globals-serializer-example 开发者 @José.Pereira 🏅 奖金$100 ,获奖项目 global-archiver 开发者 @Lorenzo.Scalese 🏅 奖金$100 ,获奖项目 blockchain - [ IRIS python ] 开发者 @davimassaru.teixeiramuta 🏅 奖金$100 ,获奖项目 Globals: Embedded Python vs. ObjectScript 开发者 @Robert.Cemper1003 🏅 奖金$100 ,获奖项目 zpm-generate-ui 开发者 @MikhailenkoSergey 🏅 奖金$100 ,获奖项目 GlobalToJSON-XL-Academic 开发者 @Robert.Cemper1003 🏅 奖金$100 ,获奖项目 Cubes 开发者 @Sean.Connelly 🏅 奖金$100 ,获奖项目 GlobalToJSON-Efficient 开发者 @Robert.Cemper1003 🏅 奖金$100 ,获奖项目 iris-globals-contest 开发者 @Oliver.Wilms 🏅 奖金$100 ,获奖项目 GlobalToJSON-Compact 开发者 @Robert.Cemper1003 🏅 奖金$100 ,获奖项目 global-name-search 开发者 @Jailton.Viçôzo 🏅 奖金$100 ,获奖项目 React-UI-Global 开发者 @Evgeniy.Potapov 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名,奖金 $1,000 ,获奖项目 globals-tool 开发者 @Dmitry.Maslennikov 🥈 第二名,奖金 $750 ,获奖项目 python-globals-serializer-example 开发者 @José.Pereira 🥉 第三名,奖金 $500 ,获奖项目 iris-globals-graphDB 开发者 @Muhammad.Waseem 恭喜所有优胜者! 感谢大家对本次比赛的关注和付出,是你们的付出让这次大赛熠熠生辉!ღ( ´・ᴗ・` )比心🙌 接下来呢? 如果没有获奖,也不要灰心气馁!要知道,失败是成功之母,坚持下去就能成功 (^-^)V 准备好,期待五月的大赛吧! 😎
文章
Qiao Peng · 四月 14, 2022

InterSystems 数据平台与三级等保 - 第三篇

8. 应用安全 InterSystems数据平台上可能运行着多种应用,例如Web网页应用、SOAP服务、REST API、HL7 接口、SQL服务等等。这些应用种类繁多,面临的安全风险也是巨大的,例如代码注入攻击和HTTP的跨站请求伪造攻击等。 这其中代码注入攻击和针对Web应用的攻击尤其需要重视。 8.1 代码注入攻击 代码注入攻击通常和我们编写的程序相关,需要在程序编写时注意避免。 8.1.1 SQL注入攻击 SQL注入攻击是典型的代码注入攻击,通过从外部注入恶意SQL语句获得数据权限并获得敏感数据。关系型访问方式都是通过客户端SQL语句传入执行的,因此它是数据库重点需要防范的。 InterSystems数据平台并不支持以分号分割的多条SQL语句作为一个SQL命令执行,因此它本身免疫了主要的SQL注入攻击手段。 InterSystems数据平台支持动态SQL,即允许SQL命令作为方法的字符串参数传入,这会给SQL注入攻击留有隐患。在编程时,应避免开放服务用于接受完整的SQL语句作为参数,而是通过SQL动态传参来构建运行时SQL。 InterSystems数据平台支持行级安全,这有助于避免在SQL注入攻击时,将所有数据返回给攻击请求。 8.1.2 $ZF InterSystems数据平台提供了系统函数$ZF,用以调用外部命令。其中$ZF(-1)和$ZF(-2)用以调用服务器操作系统的命令。这可能会成为代码攻击的隐患。 在使用$ZF开发服务时,应避免把完整的操作系统命令作为字符串参数传入来执行,而应仅传入必要的数据,由服务器端方法来组成需要执行的操作系统命令,避免注入攻击。 8.2 Web应用安全管理 InterSystems数据平台提供多种Web应用,都是基于HTTP/HTTPS协议的,例如InterSystems数据平台的管理门户网页、用户自定义的网页、开放的SOAP服务、RESTful API。 既然走HTTP/HTTPS,所以首先应该部署专用Web服务器,并配置HTTPS来提供这些Web服务,在传输通道上保障安全。 除了传输通道,要得到更安全的生产环境,还有其它的安全设置需要检查和配置。 8.2.1 CSP/ZEN用户自定义网页应用 每个InterSystems数据平台等命名空间默认都有一个Web应用,可以通过它提供用户自定义网页应用。也可以创建一个新的Web应用提供用户自定义的网页应用。 第一个要检查的项目,是要看看这些默认创建的Web应用是否需要。如果不需要,应该禁用 – 取消选中“Enable Application”。 第二个要检查的项目,是这个Web应用使用的身份认证方式。在生产环境上,不应该使用“未验证”方式,所以应该取消选中该选项。 第三个要设置合适的“必要的资源”,它是对网页应用的资源权限要求。必须具有该资源的使用权限的用户,才能访问该网页应用。 第四个要决定是否开启防CSRF攻击,建议开启“Prevent Login CSRF attack”。 8.2.2管理门户 InterSystems数据平台的管理门户就是CSP/ZEN开发的网页应用,它具有大部分系统管理和监控能力,例如安全配置、高可用配置等。 除了8.2.1提到的对网页应用的安全配置项目之外,InterSystems数据平台预置了一系列系统角色和系统资源,用于让不同用户对管理门户的不同功能页面具有不同的权限。例如操作员角色(%Operator)不具有创建、修改用户的权限。 这些用户权限检查是通过配置给管理页面的系统资源来判断的,只有对这些页面系统资源有权限的用户才能访问该管理页面。 为了提供更细颗粒度的管理,除了配置给管理门户页面上的系统资源,用户可以将自定义资源加到管理门户页面上。这样,用户需要同时具有系统定义的页面资源权限和用户自定义资源权限才能访问和使用管理页面。 如何查看系统预置的管理页面资源和配置自定义资源?在每个管理门户页面菜单项上,都有链接,点击它就可以查看该管理页面分配的系统资源和自定义资源。如果要添加自定义资源,点击“分配”,就可以在弹出的页面中进行配置。 通过配置自定义资源,可以实现任意颗粒度的管理门户权限控制。 如果您在管理互操作产品,想了解系统提供的预定义安全资源,可以参考文档 8.2.3 SOAP服务 除了SQL服务,SOAP服务是InterSystems数据平台经常要开放的服务类型之一。如果您的生产环境上开放了SOAP服务,应该检查它的安全配置。 开启SOAP服务 InterSystems数据平台的SOAP服务也是通过Web应用开放的。默认情况下,Web应用是没有开放“入站Web服务”的,也就是说默认Web应用是不能提供SOAP服务的。如果需要开放SOAP服务,需要选中对应Web应用的“入站Web服务”。 注意:如何仅是查看WSDL,并不需要开启此选项。 开启SOAP服务测试页功能 InterSystems数据平台还提供SOAP服务测试页功能,该功能可以使用Web页面来测试SOAP服务,而不需要通过SOAPUI等工具。 为了安全,默认SOAP服务测试页功能是未开启的。如果需要开启,需要通过系统安全设置项开启: SET ^SYS("Security","CSP","AllowPrefix",<SOAP应用路径>,"%SOAP.")=1 注意: 1. <SOAP应用路径>最后需要加"/",例如 "/csp/user/" 2. 该设置项不影响SOAP服务,仅影响测试页 SOAP认证与权限 在生产环境上,不应该发布无需认证的SOAP服务。因此也需要取消选中“未验证”方式。 同时通过“必要的资源”设置,可以为SOAP服务指定需要的权限。 SOAP安全协议 另外,SOAP本身有很多安全协议,例如WS-Security, WS-Policy, WS-SecureConversation, WS-ReliableMessaging... 它们提供SOAP消息头及消息体加密、数字签名等机制保障SOAP服务安全。 InterSystems数据平台支持这些SOAP安全协议,可以通过这些协议加强SOAP服务的安全。 8.2.4 RESTful API RESTful API越来越多的用于轻量化的服务提供。与SOAP服务类似,InterSystems数据平台的RESTful API也是通过Web应用提供的。 因此上面介绍的Web服务的安全检查项也适用于RESTful API应用。 另外,如果部署了InterSystems API管理器,它本身也提供了安全相关的功能,例如用户认证、权限控制等。因此也要检查InterSystems API管理器的安全设置。 8.3 安全建议 不要拼接SQL语句,而是通过传参数构建运行时的SQL 避免使用动态SQL 启用行级安全 将$ZF调用封装在方法中,避免将操作系统命令通过字符串传入 部署独立的Web服务器,并启用HTTPS 禁用"未验证"的身份验证方式 选择"密码"或"Kerberos" 开启防跨站请求伪造(CSRF) 攻击 增加必要的资源权限要求 对"应用程序角色"配置合适的角色 为SOAP服务建立独立的Web应用,不使用命名空间默认的Web应用发布SOAP服务 不应该发布不需要用户认证的SOAP服务和RESTful API! 使用合适的认证策略,例如密码或用户名令牌 使用合适的SOAP安全协议,例如消息加密、数字签名 在部署了InterSystems API管理器时,通过它进一步约束安全选项 9. 安全审计 InterSystems数据平台提供审计能力,提供防篡改的审计数据库,用于记录审计事件。审计数据可以查看、搜索和导出。 通过管理门户 > 系统 > 安全管理 > 审计 可以开启和配置审计。 InterSystems数据平台预置了一系列系统审计事件,例如用户登录事件、登录失败事件等。并非所有的预置系统审计都默认开启,用户可以在系统审计事件配置页面进行配置,决定审计哪些系统事件。 除了系统预置的审计事件,InterSystems数据平台运行用户自定义审计事件,例如谁修改了特定的类。通过管理门户 > 系统 > 安全管理 > 用户定义的审计事件 可以创建自定义审计。 9.1 安全建议 开启审计 对重要的用户级事件建立自定义审计事件 定期分析审计的用户行为模型,识别发现异常请求 10. 备份与恢复 数据平台的备份与恢复是保障数据安全的另一项机制。定期的备份保障在意外发生时数据可以最大限度的恢复。例如是误删除了数据和代码,InterSystems数据平台的镜像高可用也无法恢复这些误删除的内容,因为误删除也会在备机上重做。这时,备份是唯一可以恢复误删除数据的希望。 所以应该有备份恢复的自动化策略,定期地执行备份,并将备份保存在与生产环境隔离的地点妥善保存。 InterSystems数据平台支持多种备份工具和备份策略。 备份工具: 冷备份 – 卸载数据库,拷贝数据库文件,加载数据库。冷备份需要计划宕机时间 联机热备份 – InterSystems数据平台提供的在线备份,无需计划宕机时间。数据规模很大时,备份时间较长 外部备份(快照备份) – 在线备份,无需计划宕机时间。通常速度很快,但需要外部备份工具 InterSystems数据平台使用内建的联机热备份工具时,支持这些备份策略: 全备份 – 备份全部数据 增量备份 – 备份上次备份之后修改的所有数据 补充备份 - 备份上次全备份之后修改的所有数据 可以使用这些备份方式,组合成一个自动的备份计划,例如:周日执行全备份、周一周二执行增量备份、周三执行补充备份、周四周五周六执行增量备份。 这些备份文件和备份之后的所有日志文件(Journal文件)和数据平台配置文件,以及项目相关的静态文件一起,例如网页文件,才是完整的生产环境备份集。完整的备份集才能保证恢复到指定的时间节点上。 有了备份并不是万无一失,需要验证备份是否可用。应该建立备份集恢复测试的环境,定期对备份集进行恢复测试,以确保备份集是可用的。 10.1 安全建议 建立自动的备份任务 备份应保存在独立的存储和隔离的物理位置 定期检查备份集的可用性 11. 正确安装InterSystems数据平台 在InterSystems数据平台安装时,会提示选择安全级别。因此在安装时,就应该选择正确的安全级别,避免后期大量的安全配置检查和调整。 InterSystems数据平台安装时会提供3个安全级别选择:Minimal、Normal和Locked Down。 Minimal:是针对于本机开发环境安装的安全级别、也是最低的安全级别,通常是被用于开发者在自己的笔记本电脑上安装InterSystems数据平台的开发实例。它几乎没有安全限制,例如允许无认证登录、匿名用户拥有%All的权限。因此绝不应该在生产环境上以此级别安装。如果您已经以Minimal安全级别安装了生产环境,那应该立刻修改安全配置。 Normal:是针对通常用途的安全级别,收紧了安全策略,可以作为大多数生产环境的初始安全配置。建议生产环境安装时,以此级别进行安装,并在安装之后按需调整安全配置。 Locked Down:是针对高安全需求的生产环境的安全级别。它禁用了多数服务、收紧了服务策略,因此安装后就已经提供了一个较为安全的实例。 Minimal Normal Locked Down 安全设置 密码模式 3.32ANP 3.32ANP 8.32ANP 不活动禁用天数* 0 90天 90天 启用_SYSTEM用户 是 是 否 分配给用户UnknownUser的角色 %All 无 无 服务策略 Use 权限为公共权限 是 是 否 需要认证 否 是 是 服务 %Service_Bindings 启用 启用 禁用 %Service_CacheDirect 启用 禁用 禁用 %Service_CallIn 启用 禁用 禁用 %Service_ComPort 禁用 禁用 禁用 %Service_Console* 启用 启用 启用 %Service_ECP 禁用 禁用 禁用 %Service_Monitor 禁用 禁用 禁用 %Service_Telnet* 禁用 禁用 禁用 %Service_Terminal† 启用 启用 启用 %Service_WebGateway 启用 启用 启用 12. InterSystems 数据平台的安全建议工具 InterSystems数据平台提供安全检查和建议工具。通过管理门户 >系统 > 安全管理 > 安全顾问 即可使用该工具。 安全建议工具会提示安全建议,点击“详细信息”链接,会自动跳到对应安全配置页面。在生产环境上线前,建议使用该工具进行检查。 13. InterSystems 数据平台三级等保检查清单 针对三级等保合规,检查清单如下: 1. 配置基于TLS的数据加密通道** 所有对InterSystems 数据平台的连接方式都配置使用加密通道 2. 部署独立的Web服务器 配置Web服务器应用HTTPS,并禁用不安全的 HTTP 方法 3. 服务配置 关闭不必要的服务 对必要开启的服务,选择安全的认证方式 禁用“未验证”方式 进一步限定允许接入的IP地址 4. 加强认证 系统级禁用 “无认证” 选用更安全的认证方式 5. 收紧授权** 数据库应该设置自己独立的资源,而非使用%DB_%DEFAULT 谨慎使用公共权限 创建自己需要保护的新资源** 6. 用户与角色 仅管理员有%All角色 要求用户账号更安全的密码模式 设置密码错误数次后停用账号 7. 数据安全 对敏感数据进行全数据库加密 合理的数据读写权限 必要时,添加行级和列级安全** 8. 应用安全 不要拼接SQL语句,而是通过传参数构建运行时的SQL** 避免使用动态SQL** 启用行级安全** 将$ZF调用封装在方法中,避免将操作系统命令通过字符串传入** 禁用不必要的Web应用 ** 对Web应用,禁用"未验证"的身份验证方式 对Web应用,开启防跨站请求伪造(CSRF) 攻击 对Web应用,对"应用程序角色"配置合适的角色,不应随意赋予%All ** 为SOAP服务建立独立的Web应用,不使用命名空间默认的Web应用发布SOAP服务 ** 不应该发布不需要用户认证的SOAP服务和REST API! 使用合适的SOAP安全策略,例如消息加密、数字签名 9. 审计 开启审计 对重要的用户级事件建立自定义审计事件 ** 定期分析审计的用户行为模型,识别发现异常请求 ** 10. 备份与恢复 建立自动的备份任务 备份应保存在独立的存储和隔离的物理位置 定期检查备份集的可用性 注:**项目不是三级等保的必查项,但建议进行检查和配置。
文章
姚 鑫 · 六月 8, 2021

第一章 InterSystems XML工具简介

# 第一章 InterSystems XML工具简介 介绍了如何使用 IRIS `XML`工具。 InterSystems IRIS为`XML`处理带来了对象的力量--可以使用对象作为`XML`文档的直接表示,反之亦然。由于InterSystems IRIS包括本机对象数据库,因此可以将此类对象直接用于数据库。此外,InterSystems IRIS提供了用于处理`XML`文档和`DOM`(文档对象模型)的工具,即使它们与任何InterSystems IRIS类无关。 # 用XML表示对象数据 有些InterSystems IRIS `XML`工具主要用于支持`XML`的类。要为类启用`XML`,需要将`%XML.Adaptor`添加到其超类列表中。`%XML.Adaptor`类使能够将该类的实例表示为XML文档。可以添加类参数和属性参数来微调投影。 ![image](/sites/default/files/inline/images/1_48.png) 对于启用了`XML`的类,数据可以采用以下所有形式: - 包含在类实例中。根据类的不同,还可以将数据保存到磁盘,在磁盘中数据可以像其他持久类一样以所有相同的方式使用。 - 包含在`XML`文档中,可以是文件、流或其他文档。 - 包含在`DOM`(文档对象模型)中。 下图概述了用于在这些表单之间转换数据的工具: ![image](/sites/default/files/inline/images/2_28.png) `%XML.Writer`类使能够创建`XML`文档。输出目的地通常是文件或流。确定要包括在输出中的对象,系统根据在类定义中建立的规则生成输出。 `%XML.Reader`类使能够将合适的`XML`文档导入到类实例中。源通常是文件或流。要使用此类,需要指定类名和`XML`文档中包含的元素之间的关联。给定的元素必须具有相应类所需的结构。然后您逐个节点地阅读文档。这样做时,系统会创建该类的内存中实例,其中包含在`XML`文档中找到的数据。 `DOM`也是处理`XML`文档的有用方法。可以使用`%XML.Reader`类读取`XML`文档并创建表示它的`DOM`。在此表示中,`DOM`是一系列节点,可以根据需要在它们之间导航。具体地说,将创建`%XML.Document`的一个实例,该实例表示文档本身并包含节点。然后使用`%XML.Node`检查和操作节点。如果需要,可以使用`%XML.Writer`重新编写XML文档。 InterSystems IRIS `XML`工具提供了许多方法来访问和修改`XML`文档和`DOM`中的数据。 # 创建任意XML 还可以使用InterSystems IRIS `XML`工具创建和使用任意XML-即不映射到任何InterSystems IRIS类的`XML`。要创建任意XML文档,请使用`%XML.Writer`。该类提供了用于添加元素、添加属性、添加命名空间声明等的方法。 要创建任意DOM,请使用`%XML.Document`。该类提供了一个类方法,该方法返回具有单个空节点的DOM。然后根据需要使用该类的实例方法添加节点。 或者使用`%XML.Reader`读取任意XML文档,然后从该文档创建DOM。 # 访问数据 InterSystems IRIS `XML`工具提供了几种访问XML格式数据的方法。下图显示了摘要: ![image](/sites/default/files/inline/images/3_23.png) 对于任何格式良好的XML文档,都可以使用以下类来处理该文档中的数据: - `%XML.TextReader`-可以使用它逐个节点地读取和解析文档。 - `%XML.XPATH.Document`-可以使用它来获取数据,方法是使用引用文档中特定节点的`XPath`表达式。 在InterSystems IRIS中,DOM是`%XML.Document`的实例。该实例表示文档本身并包含节点。可以使用该类的属性和方法从`DOM`中检索值。可以使用`%XML.Node`检查和操作节点。 # 修改XML InterSystems IRIS XML工具还提供了修改`XML`格式数据的方法。下图显示了摘要: ![image](/sites/default/files/inline/images/4_17.png) 对于`XML`文档,可以使用`%XML.XSLT.Transformer`中的类方法执行`XSLT`转换并获得文档的修改版本。 对于DOM,可以使用`%XML.Document`的方法修改`DOM`。例如,可以添加或删除元素或属性。 # SAX解析器 InterSystems IRIS XML工具使用InterSystems IRIS SAX(Simple API For XML)解析器。这是一个内置的SAX XML验证解析器,使用标准`Xerces`库。`SAX`是一个解析引擎,它提供完整的XML验证和文档解析。InterSystems IRIS SAX使用高性能的进程内调入机制与InterSystems IRIS进程通信。使用此解析器,可以使用内置的InterSystems IRIS XML支持或通过在InterSystems IRIS中提供您自己的自定义`SAX`接口类来处理`XML`文档。 对于特殊应用程序,可以创建自定义实体解析器和内容处理程序。 可以使用行业标准的`XMLDTD`或模式验证来验证任何传入的`XML`,并且可以指定要解析的XML项。 # 其他XML工具 InterSystems IRIS `XML`支持包括以下附加工具: - XML架构向导读取XML架构文档,并生成一组支持XML的类,这些类与架构中定义的类型相对应。可以指定一个包来包含类,以及控制类定义详细信息的各种选项。 - `%XML.Schema`类使能够从一组启用了XML的类生成XML架构。 - `%XML.Namespaces`类使能够检查XML命名空间以及其中的类,以查找InterSystems IRIS命名空间。 - `%XML.Security.EncryptedData`类和其他类使能够加密XML文档以及解密加密文档。 - `%XML.Security.Signature`类和其他类使能够对XML文档进行数字签名,以及验证数字签名。 # 使用XML工具时的注意事项 在使用任何类型的XML工具时,至少有三个一般要点需要考虑: - 任何XML文档都有字符编码 - 将XML文档映射到类(文字或`SOAP`编码)有不同的方法 - 应该知道SAX解析器的默认行为 # 输入输出的字符编码 导出XML文档时,可以指定要使用的字符编码;否则,InterSystems IRIS会根据目标选择编码: - **如果输出目标是文件或二进制流,则默认值为`“UTF-8”`**。 - 如果输出目标是字符串或字符流,则默认`为"UTF-16"`。 对于InterSystems IRIS读取的任何`XML`文档,文档的XML声明应该指示该文件的字符编码,并且文档应该按照声明的方式进行编码。例如: ``` ``` 但是,如果文档中未声明字符编码,InterSystems IRIS将假定: - 如果输出目标是文件或二进制流,则默认值为`“UTF-8”`。 - 如果输出目标是字符串或字符流,则默认为`"UTF-16"`。 # 选择文档格式 使用`XML`文档时,必须知道将文档映射到InterSystems IRIS类时要使用的格式。同样,在创建`XML`文档时,需要指定编写文档时要使用的文档格式。`XML`文档格式如下: - 文字表示文档是对象实例的文字副本。在大多数情况下,即使在使用`SOAP`时,也使用文字格式。除非另有说明,否则文档中的示例均使用文字格式。 - 编码的意思是按照`SOAP 1.1`标准或`SOAP 1.2`标准中描述的编码。`SOAP1.1`和`SOAP1.2`的细节略有不同。 以下小节显示了这些文档格式之间的差异。 ## 文字格式 ```java Klingman,Julie G. 1946-07-21 W897 Bensonhurst 60302 Jung,Kirsten K. Xiang,Charles R. Frith,Terry R. ``` ## 编码格式 相比之下,下面的示例以编码格式显示相同的数据: ```java ... Jung,Kirsten K. ... Quixote,Umberto D. ... Chadwick,Mark L. ... Klingman,Julie G. 1946-07-21 W897 Bensonhurst 60302 ... ``` 请注意编码版本中的以下差异: - 输出的根元素包括`SOAP`编码命名空间和其他标准命名空间的声明。 - 本文档包括同一级别的人员、地址和医生元素。`Address`和`Doctor`元素列出了引用它们的`Person`元素使用的唯一`ID`。每个对象值属性都是这样处理的。 - 顶级`Address`和`Doctor`元素的名称与各自类的名称相同,而不是与引用它们的属性名称相同。 - 编码格式不包括任何属性。`GroupID`属性被映射为`Person`类中的属性。在文字格式中,此属性被投影为特性。但是,在编码版本中,属性被投影为元素。 - 对集合的处理方式不同。例如,列表元素具有属性`ENC:arrayType`.。 - 每个元素都有一个`xsi:type`属性的值。 注意:对于`SOAP1.2`,编码版本略有不同。要轻松区分版本,请检查SOAP编码命名空间的声明: - 对于`SOAP1.1,SOAP`编码命名空间为`"http://schemas.xmlsoap.org/soap/encoding/"` - 对于`SOAP1.2,SOAP`编码命名空间为`"http://schemas.xmlsoap.org/wsdl/soap12/"` 除非解析器可以使用这些其他模式,否则验证将失败。特别是对于WSDL文档,有时需要下载所有模式并编辑主模式以使用正确的位置。 它尝试解析所有实体,包括所有外部实体。(其他XML解析器也会这样做。)。这一过程可能很耗时,具体取决于它们所在的位置。具体地说,`Xerces `使用网络访问器来解析一些URL,并且实现使用阻塞I/O。因此,不会超时,网络获取可能会在错误条件下挂起,这在实践中很少见。 此外,`Xerces`不支持`https`;也就是说,它不能解析位于`https`位置的实体。 如果需要,可以创建自定义实体解析器,也可以禁用实体解析; # IRIS支持的标准 IRIS XML支持遵循以下标准: - XML 1.0 (https://www.w3.org/TR/REC-xml/) - Namespaces in XML 1.0 (https://www.w3.org/TR/REC-xml-names/) - XML Schema 1.0 (https://www.w3.org/TR/xmlschema-0/, https://www.w3.org/TR/xmlschema-1/, https://www.w3.org/TR/xmlschema-2/) - XPath 1.0 as specified by https://www.w3.org/TR/xpath - SOAP 1.1标准第5节指定的SOAP 1.1编码。 - SOAP1.2编码,如第3节第2部分: Adjuncts (https://www.w3.org/TR/soap12-part2/) of the SOAP 1.2 standard. - XML Canonicalization Version 1.0 (also known as inclusive canonicalization), as specified by https://www.w3.org/TR/xml-c14n. - XML Exclusive Canonicalization Version 1.0 as specified by https://www.w3.org/TR/xml-exc-c14n/, including the InclusiveNamespaces PrefixList feature (https://www.w3.org/TR/xml-exc-c14n/#def-InclusiveNamespaces-PrefixList) - XML Encryption (https://www.w3.org/TR/xmlenc-core/) InterSystems IRIS支持使用RSA-OAEP或RSA-1.5进行密钥加密,并支持使用AES-128、AES-192或AES-256对邮件正文进行数据加密。 - XML Signature using Exclusive XML Canonicalization and RSA SHA-1 (https://www.w3.org/TR/xmldsig-core/) InterSystems IRIS提供两个XSLT处理器: - Xalan处理器支持XSLT 1.0。 - Saxon处理器支持XSLT 2.0。 **注意:InterSystems IRIS不支持在一个元素中有多个名称相同的属性,每个属性位于不同的名称空间中。**