队列和主题端点
PubSub+事件代理支持以下类型的端点,用于接收、存储和传递保证消息:
- 队列
- 主题端点
这两种类型的端点只在事件代理上可见。客户端应用程序连接到具有它想要消费消息的端点的事件代理。端点的存在不会通过控制或路由协议从一个事件代理传播到另一个事件代理,因此端点不需要在整个网络中具有唯一名称。
队列比主题端点更加灵活,是大多数应用程序推荐的解决方案。主题端点的使用应限制在JMS应用程序中。
端点持久性
队列和主题端点可以是持久的或临时的,但分区队列只能持久。
持久端点
持久队列和主题端点是事件代理上具有独立于特定客户端会话的生命周期的预配置对象。它们也能在事件代理重启后存活,并作为事件代理配置的一部分被保留,用于备份和恢复目的。管理员可以通过Solace CLI、SEMP或PubSub+代理管理器预配置持久队列和主题端点。客户端应用程序也可以通过Solace消息API动态配置持久端点。
持久端点有一个相关的访问类型,它决定了消息如何被传递到绑定的消费者流程。有关更多信息,请参见队列访问类型和主题端点。
临时端点
临时队列和主题端点由客户端应用程序动态创建和销毁。临时队列和主题端点通常被用作服务请求的临时目的地。
当客户端应用程序有一个连接的会话时,它可以配置一个临时队列或主题端点,并创建一个消费者流程绑定到它。这些临时队列和主题端点是非持久的,因为它们只存在于客户端会话连接期间。只有一个消费者可以绑定到非持久端点,不支持多个消费者或非独占访问。
临时目的地的命名由应用程序控制。在客户端的BIND请求中,提供了一个名称。如果目的地不存在,则创建一个。
当客户端动态创建一个队列时,它由客户端可能提供的创建API函数或方法中的那些端点属性和配置标志进行配置。任何其他端点参数都使用管理员通过Solace CLI预配置的端点的值进行配置。默认情况下,使用系统默认值。然而,也可以使用CLI预配置的队列和主题端点,并自定义值,这些值将应用于任何新的客户端创建的队列和主题端点。
如果满足以下条件,可以动态创建非持久队列或主题端点:
- 客户端与允许客户端创建端点的配置文件相关联。参见允许客户端创建保证端点。
- 客户端连接的 消息VPN可用的端点数量没有达到。参见消息VPN级保证消息配置。
- 客户端配置文件中每个客户端用户名允许的端点数量没有超出。参见配置每个客户端用户名允许的最大端点数。
- 端点数量没有超出系统范围的限制。
主题订阅
您可以向持久端点添加一个或多个主题订阅,以便将匹配主题的保证消息传递到该端点。
任何发布到与端点关联的订阅匹配的主题的保证消息都将被传递到这些端点。如果由于任何原因无法将消息传递到一个或多个端点,将向发布者返回错误指示。也就是说,向发布者的反馈与直接发布到端点时提供的反馈相同。
如下所示,主题订阅允许单个发布到主题的消息被传递到主题端点、队列和具有匹配直接消息主题订阅的消费者客户端的组合。有关如何更改消息的传递模式以将消息传递到客户端的主题订阅的信息,请参阅主题匹配和消息传递模式。
添加订阅的机制取决于端点的类型:
- 对于队列,订阅可以作为队列本身的属性进行配置。订阅映射适用于持久和非持久队列。如果您出于任何原因删除了一个队列,为该队列配置的所有主题订阅也将被删除。使用PubSub+代理管理器向队列添加订阅,参见在PubSub+云中向队列添加订阅或向软件事件代理和设备中的队列添加订阅。使用Solace CLI向队列添加订阅,参见向队列添加主题订阅。要了解客户端应用程序如何添加订阅,参见向队列添加订阅。
- 对于主题端点,客户端在流程绑定请求中指定其所需的订阅。有关更多信息,请参见向主题端点添加订阅。
主题订阅异常
除了主题订阅外,您还可以向持久队列添加一个或多个主题订阅异常,以便将匹配主题的保证消息不传递到队列。主题端点不支持主题订阅异常。
使用主题订阅异常可以轻松排除特定主题从传递到队列的主题集合中,方法是在主题订阅前添加一个领先的"!"字符。例如,如果您向队列添加了主题订阅"animals/f*"和一个主题订阅异常"!animals/fox",那么发布到"animals/frog"的保证消息将被传递到队列;然而,发布到"animals/fox"的消息将被丢弃。
主题订阅异常默认启用,并且总是优先于订阅,无论订阅和异常的配置顺序如何。要在事件代理上启用或禁用此功能,请参阅系统级订阅异常配置。
要在队列上配置订阅异常,参见向队列添加主题订阅异常。
端点权限和访问控制
下面的流程图显示了用于确定客户端是否可以绑定到端点以及浏览或消费端点消息的访问控制层。
第一层是与相关客户端配置文件中的配置,它决定了客户端是否被允许接收保证消息。如果允许 ,然后检查端点权限。
端点权限规则如下:
- 所有者对端点有完全访问权限。端点的所有者是可配置的。对于动态创建的端点,默认所有者是创建端点的客户端用户名。
- CLI创建的队列和主题端点只能通过CLI删除。
- 每个端点都有一个“Permission All”参数,它决定了除端点所有者之外的其他访问控制客户端拥有什么访问权限。默认情况下,“Permission All”参数的权限级别为
none
。然而,可以在通过CLI或通过消息API动态创建端点时显式指定权限。也可以通过CLI更改权限级别。
以下级别可用的权限:
- none - 无访问权限。
- read-only - 只允许读取消息;它们不能从消息缓冲区中移除或消费。
- consume - 允许从消息缓冲区浏览和消费消息。
- modify-topic - 允许修改分配给端点的主题。modify-topic也隐含了consume相同的权限。
- delete - 允许删除队列或主题端点。delete也隐含了modify-topic相同的权限。
选择器
选择器是客户端在绑定到端点时可以应用的过滤器。它们使客户端能够根据消息的头部字段和属性值来过滤他们感兴趣的消息。选择器是一个最多2,000字节的字符串,使用SQL92的子集的条件表达式语法。
如下所示,选择器可以从队列和主题端点过滤消息。
-
对于队列:任何与客户端选择器字符串不匹配的消息都不会被传递给请求客户端,但保留在队列中。 选择器不支持分区队列。
-
对于主题端点:任何与选择器不匹配的消息都不会被传递给请求客户端,但会从主题端点中移除。 主题端点上的选择器作为后台进程运行,以避免放慢发布管道。可以看到主题端点中的消息数量随着选择器的应用而缩小。例如,如果发布了100条匹配主题端点相关主题的消息,那么这100条消息被缓冲到主题端点。相关的选择器开始测试这100条新消息,选择器拒绝的任何消息将从主题端点中移除。如果与主题端点相关联的选择器,那么在选择器过滤消息之前,必须将选择器应用于流程。如果主题或选择器发生变化,那么在应用新的主题和选择器之前,所有消息都从主题端点中移除。
客户端应用程序在浏览队列时也可以指定选择器字符串,以便客户端只浏览与选择器匹配的消息。
使用选择器时的性能考虑
虽然完全支持选择器,但通常使用主题匹配而不使用选择器时可以获得最佳性能。在许多情况下,可以将在选择器中选择的消息属性包含在主题层次结构中。然后可以使用主题订阅和主题订阅异常来匹配主题的相关级别,以实现类似选择器表达式匹配。
主题订阅和主题订阅异常支持通配符和前缀匹配。有了通配符、异常和为队列或主题端点指定多个订阅或异常的能力,可以实现AND、OR和NOT等匹配操作。
在使用选择器从深队列检索消息时,也要考虑性能。Solace事件代理需要检索队列中的每条消息,可能从磁盘中检索,以评估其内容是否符合消费者的选择器表达式。如果队列非常深,可能需要几秒钟才能 找到第一条匹配的消息。大消息也更长时间地检索和评估选择器表达式。 这些挑战在使用主题订阅进行过滤时被消除,因为过滤发生在事件代理将消息添加到队列之前。
总的来说,应尽可能避免使用选择器。