本章介绍如何使用 imqcmd 实用程序管理物理目的地。Message QueueTM 消息通过代理上的物理目的地路由到使用方客户端。代理管理与物理目的地关联的内存和持久性存储库并设置它们的行为。
在代理群集中,您在某个代理上创建一个物理目的地后,群集会将该物理目的地传播给所有其他代理。应用程序客户端可以订阅某一主题,或者使用群集中任何代理上的队列,因为这些代理会协同工作,在整个群集中路由消息。但是,该消息的持久性和确认只由最初生成消息的代理负责管理。
本章包含以下主题:
表 13–5 中提供了用于管理物理目的地和完成上述任务的 imqcmd 子命令的完整参考信息。
有关物理目的地的介绍,请参见 Message Queue 技术概述。
每当与物理目的地交互时,客户端应用程序都会使用目的地对象。为了实现提供者无关性和可移植性,客户端通常使用管理员创建的目的地对象,这些对象称为目的地受管理对象。可以配置受管理对象,使其可供客户端应用程序使用,如第 8 章,管理受管理对象中所述。
可以使用 Message Queue 命令实用程序 (imqcmd) 来管理物理目的地。 imqcmd 命令的语法与管理其他代理服务时的语法一样。
有关 imqcmd 及其子命令和选项的完整参考信息,请参见第 13 章,命令行参考。
表 6–1 列出了 imqcmd 子命令,本章介绍了这些子命令的用法。 有关这些子命令的参考信息,请参见物理目的地管理。
表 6–1 命令实用程序的物理目的地子命令
子命令和参数 |
描述 |
---|---|
compact dst |
压缩一个或多个物理目的地的基于文件的数据存储库。 |
create dst |
创建物理目的地。 |
destroy dst |
销毁物理目的地。 |
list dst |
列出代理中的物理目的地。 |
metrics dst |
显示物理目的地度量。 |
pause dst |
暂停代理中的一个或多个物理目的地。 |
purge dst |
清除物理目的地中的所有消息,但不销毁该物理目的地。 |
query dst |
查询并显示有关物理目的地的信息。 |
resume dst |
恢复代理中的一个或多个暂停的物理目的地。 |
update dst |
更新目的地属性。 |
要创建物理目的地,请使用 imqcmd create 子命令。 下面是 create 子命令的语法:
create dst -t destType -n destName [-o property=value ] [-o property=value1] …
例如,要创建队列目的地,请输入以下命令:
imqcmd create dst -n myQueue -t q -o "maxNumActiveConsumers=5" |
要创建主题目的地,请输入以下命令:
imqcmd create dst -n myTopic -t t -o "maxBytesPerMsg=5000" |
创建物理目的地时,请指定以下内容:
物理目的地类型 t(主题)或 q(队列)。
物理目的地名称。命名规则如下:
名称必须仅包含字母数字字符。不能包含空格。
名称可以字母字符、下划线字符 (_) 或美元符号 ($) 开头。名称不能以字符串 mq 开头。
物理目的地属性的非默认值。
也可以在更新物理目的地时设置属性。
许多物理目的地属性都影响代理的内存资源和消息流。例如,可以指定能发送到物理目的地的生成方数量,它们可以发送的消息数量和大小,以及达到物理目的地限制时代理应做出的响应。这些限制与由代理配置属性控制的代理范围的限制类似。
以下属性既适用于队列目的地,也适用于主题目的地:
maxNumMsgs。指定物理目的地中允许的未使用消息的最大数量。
maxBytesPerMsg。指定物理目的地中允许的任何单个消息的最大大小(以字节为单位)。
isLocalOnly。仅适用于代理群集。指定物理目的地不能在其他代理上复制,因而限定只能将消息传送到本地使用方(连接到创建物理目的地的代理的使用方)。
useDMQ。指定是丢弃物理目的地的停用消息,还是将其放在停用消息队列中。
以下属性只适用于队列目的地:
maxNumBackupConsumers。指定当来自队列目的地的负载平衡传送中出现任何错误时,可以代替活动使用方的最大备份使用方数。
localDeliveryPreferred。仅应用于代理群集中的负载平衡队列传送。指定仅当本地代理中没有使用方时才将消息传送到远程使用方。
有关物理目的地属性的完整参考信息,请参见第 15 章,物理目的地属性参考。
对于自动创建的目的地,在代理的实例配置文件中设置默认属性值。有关自动创建的属性的参考信息,请参见表 14–3。
可以获得有关物理目的地的当前属性值、与物理目的地关联的生成方和使用方的数量以及消息传送度量(例如,物理目的地中消息的数量和大小)的信息。
要找到您希望获取其信息的物理目的地,请使用 list dst 子命令列出代理中的所有物理目的地。 下面是 list dst 子命令的语法:
list dst [-t destType] [-tmp]
该命令列出指定类型的物理目的地。目的地类型 (-t) 选项的值可以是 q(queue,队列)或 t(topic,主题)。
如果省略目的地类型,将列出所有类型的物理目的地。
list dst 子命令可以选择指定要列出的目的地的类型或包含临时目的地(使用 -tmp 选项)。临时目的地由客户端创建,通常用于接收发送到其他客户端的消息的回复。
例如,要获得在 myHost 端口 4545 上运行的代理中的所有物理目的地列表,请输入以下命令:
imqcmd list dst -b myHost:4545
除非指定目的地类型 t(表示只包括主题),否则,除其他所有物理目的地外,还始终会显示停用消息队列 mq.sys.dmq 的信息。
要获得有关物理目的地当前属性的信息,请使用 query dst 子命令。下面是 query dst 子命令的语法:
query dst -t destType -n destName
此命令列出有关指定类型和名称的目的地的信息。例如,以下命令显示有关队列目的地XQueue 的信息:
imqcmd query dst -t q -n XQueue -u admin
此命令将产生类似如下内容的输出:
------------------------------------ Destination Name Destination Type ------------------------------------ XQueue Queue On the broker specified by: ------------------------- Host Primary Port ------------------------- localhost 7676 Destination Name XQueue Destination Type Queue Destination State RUNNING Created Administratively true Current Number of Messages 0 Current Total Message Bytes 0 Current Number of Producers 0 Current Number of Active Consumers 0 Current Number of Backup Consumers 0 Max Number of Messages unlimited (-1) Max Total Message Bytes unlimited (-1) Max Bytes per Message unlimited (-1) Max Number of Producers 100 Max Number of Active Consumers 1 Max Number of Backup Consumers 0 Limit Behavior REJECT_NEWEST Consumer Flow Limit 1000 Is Local Destination false Local Delivery is Preferred false Use Dead Message Queue true |
输出还显示与目的地关联的生成方和使用方的数量。对于队列目的地,该数量包括活动使用方和备份使用方。
可以使用 update dst 子命令更改一个或多个属性的值(请参见更新物理目的地属性)。
可以使用 update dst 子命令更改物理目的地的属性,并使用 -o 选项指定要更新的属性。 下面是 update dst 子命令的语法:
update dst -t destType -n destName -o property=value [[-o property=value1]…]
此命令更新指定目的地上指定属性的值。属性名可以是表 15–1 中列出的任何属性。
可以使用 -o 选项多次更新多个属性。 例如,以下命令将 maxBytesPerMsg 属性更改为 1000,同时将 MaxNumMsgs 属性更改为 2000:
imqcmd update dst -t q -n myQueue -o “maxBytesPerMsg=1000” -o “maxNumMsgs=2000” -u admin
有关可以更新的属性列表,请参见第 15 章,物理目的地属性参考。
不能使用 update dst 子命令更新物理目的地的类型或更新 isLocalOnly 属性。
停用消息队列是专用的物理目的地,其属性与其他目的地的属性稍有不同。有关详细信息,请参见使用停用消息队列。
可暂停物理目的地以控制从生成方到目的地的消息传送,或从目的地到使用方的消息传送,或者同时控制二者。特别是,可暂停到目的地的消息流,以防止当消息的生成速度明显快于使用速度时,目的地由于所包含的消息过多而过载。 压缩物理目的地之前,必须先暂停它。
要暂停流入或流出物理目的地的消息传送,请使用 pause dst 子命令。下面是 pause dst 子命令的语法:
pause dst [-t destType -n destName] [-pst pauseType]
对于指定类型和名称的目的地,此子命令暂停将消息传送给使用方 (-pst CONSUMERS ),或暂停从生成方传送消息 (-pst PRODUCERS),或同时暂停二者 ( -pst ALL)。如果未指定目的地类型和名称,则暂停所有物理目的地。默认值为 ALL。
示例:
imqcmd pause dst -n myQueue -t q -pst PRODUCERS -u admin imqcmd pause dst -n myTopic -t t -pst CONSUMERS -u admin
要恢复向暂停目的地的传送,请使用 resume dst 子命令。下面是 resume dst 子命令的语法:
resume dst [-t destType -n destName]
此子命令恢复向指定类型和名称的暂停目的地传送消息。如果未指定目的地类型和名称,则恢复所有目的地。
示例:
imqcmd resume dst -n myQueue -t q
在代理群集中,物理目的地实例位于群集的各个代理中。 必须逐一暂停各个目的地。
可以清除物理目的地上当前排队的所有消息。清除物理目的地意味着目的地上存储的所有消息都将被删除。
当堆积的消息占用了过多的系统资源时,可能需要清除消息。当某个队列没有注册的使用方客户端,但仍然接收大量消息时,可能会发生这种情况。如果某个主题的长期订户始终处于非活动状态也可能发生这种情况。在上述两种情况下,都没有必要保留消息。
要清除物理目的地中的消息,请使用 purge dst 子命令。下面是 purge dst 子命令的语法:
purge dst -t destType -n destName
示例:
imqcmd purge dst -n myQueue -t q -u admin imqcmd purge dst -n myTopic -t t -u admin
如果关闭代理后不希望在重新启动代理时传送过时消息,请使用 -reset messages 选项清除过时消息;例如:
imqbrokerd -reset messages -u admin
这样可以避免重新启动代理后清除目的地的麻烦。
在代理群集中,物理目的地实例位于群集的各个代理中。必须分别清理每个目的地。
要销毁物理目的地,请使用 destroy dst 子命令。下面是 destroy dst 子命令的语法:
destroy dst -t destType -n destName
示例:
imqcmd destroy dst -t q -n myQueue -u admin
销毁物理目的地将清除该目的地中的所有消息并将该目的地从代理中删除,此操作是不可逆的。
不能销毁停用消息队列。
如果使用基于文件的数据存储库作为消息的持久性存储库,则可以监视磁盘使用情况并在必要时压缩磁盘。
可构建基于文件的消息存储库,以便将消息存储在与保存它的物理目的地对应的目录中。在每个物理目的地的目录中,大多数消息都存储在一个由大小可变的记录组成的文件中。 (为减少文件碎片,大小超过可配置阈值的消息将存储在单独的文件中。)
由于各种大小的消息先持久化,然后从记录文件中删除,因此可能会在文件中形成漏洞,从而使得文件中的空闲记录无法再次使用。
为管理未使用的空闲记录,命令实用程序包含用于监视每个物理目的地的磁盘利用率的子命令,以及在磁盘利用率降低时用于回收空闲磁盘空间的子命令。
imqcmd metrics dst -t q -n myQueue -m dsk -u admin
此命令将产生类似如下内容的输出:
-------------------------------------- Reserved Used Utilization Ratio -------------------------------------- 806400 804096 99 1793024 1793024 100 2544640 2518272 98 |
子命令输出中的各列具有以下含义:
表 6–2 物理目的地磁盘占用度量
度量 |
描述 |
---|---|
保留的 |
所有记录使用的磁盘空间(以字节为单位),其中包括保存活动消息的记录以及等待再次使用的空闲记录。 |
已用的 |
保存活动消息的记录使用的磁盘空间(以字节为单位)。 |
利用率 |
磁盘利用模式取决于使用特定物理目的地的消息发送应用程序的特征。根据流入和流出物理目的地的消息的相对数量,以及消息的相对大小,保留的磁盘空间可能会随时间而增加。
如果消息生产率大于消息使用率,则通常应该重新使用空闲记录,且应提高利用率。但是,如果消息生产率等于或小于消息使用率,则应降低利用率。
通常,应尽量使保留的磁盘空间保持一个稳定的量,并使磁盘利用率保持较高水平。一般规则是:如果系统达到稳定状态(其中保留的磁盘空间量较为稳定),且磁盘利用率较高(大于 75%),则不必回收未使用的磁盘空间。 如果系统达到稳定状态,而利用率较低(低于 50%),则可压缩磁盘以回收空闲记录占用的磁盘空间。
可以使用 compact dst 子命令压缩数据存储库。 下面是 compact dst 子命令的语法:
compact dst [-t destType -n destName]
此子命令为指定类型和名称的物理目的地压缩基于文件的数据存储库。如果未指定目的地类型和名称,则会压缩所有目的地。 压缩之前必须先暂停物理目的地。
如果保留的磁盘空间随时间持续增加,请通过设置目的地内存限制属性和限制行为来重新配置目的地的内存管理(请参见表 15–1)。
暂停目的地。
imqcmd pause dst -t q -n myQueue -u admin |
压缩磁盘。
imqcmd compact dst -t q -n myQueue -u admin |
恢复物理目的地。
imqcmd resume dst -t q -n myQueue -u admin |
如果未指定目的地类型和名称,则会为所有物理目的地执行此操作。
停用消息队列 mq.sys.dmq 是系统创建的物理目的地,它保存代理的停用消息及其他物理目的地。 停用消息队列是一个工具,用于监视、调整系统效率以及故障排除。有关术语“停用消息”的定义以及停用消息队列的更详细介绍,请参见 Message Queue 技术概述。
代理在启动时会自动创建停用消息队列。如果代理无法处理消息或者消息的有效期到期,则代理会将消息放入该队列中。另外,其他物理目的地也可以使用停用消息队列来保存丢弃的消息。通过使用停用消息队列,可以提供有利于排除系统故障的信息。
默认情况下,物理目的地配置为使用停用消息队列。可以通过设置物理目的地属性 useDMQ 来禁止或允许物理目的地使用停用消息队列。
下面的示例创建一个名为 myDist 的队列,该队列在默认情况下使用停用消息队列:
imqcmd create dst -n myDist -t q
下面的示例禁止上述队列使用停用消息队列:
imqcmd update dst -n myDist -t q -o useDMQ=false
通过设置 imq.autocreate.destination.useDMQ 代理属性,可以允许或禁止代理中所有自动创建的物理目的地使用停用消息队列。
可以使用 Message Queue 命令实用程序 (imqcmd) 像管理其他队列那样来管理停用消息队列,但有一些不同之处。 例如,由于停用消息队列是系统创建的,因此您不能创建、暂停或销毁它。另外,如表 6–3 中所示,停用消息队列的默认值有时与普通队列的默认值不同。
配置停用消息队列与配置其他队列相似,但某些物理目的地属性不应用默认值或具有不同的默认值。表 6–3 列出了停用消息队列以独特方式处理的队列属性。
表 6–3 标准物理目的地属性的停用消息队列处理
代理可以将完整的消息放入停用消息队列中,也可以丢弃消息主体内容,而只保留标题和属性数据。默认情况下,停用消息队列存储完整的消息。
如果要减小停用消息队列的大小并且不打算恢复停用消息,请考虑将 imq.destination.DMQ.truncateBody 代理属性设置为 true:
imqcmd update bkr -o imq.destination.DMQ.truncateBody=true
这将丢弃消息主体,而只保留标题和属性数据。
默认情况下将禁用停用消息日志记录。启用停用消息日志记录使代理可以记录以下事件:
代理将消息移至停用消息队列中
代理丢弃来自停用消息队列以及来自不使用停用消息队列的任何物理目的地的消息
物理目的地达到其限制
以下命令启用停用消息日志记录:
imqcmd update bkr -o imq.destination.logDeadMsgs=true
停用消息日志记录适用于使用停用消息队列的所有物理目的地。不能对单个物理目的地启用或禁用日志记录。