【发布时间】:2018-03-25 13:39:01
【问题描述】:
这个问题类似于method overloading vs optional parameter 但是 1) 它与服务端点有关,并且 2) 可选参数可能表示不同的语义含义:
假设我在我的服务中提供了一个端点,比如“/messaging/subscribe”,它基本上允许客户端订阅一些主题。因此,订阅请求对象可能包含主题名称列表和足以让服务在向订阅主题之一发布消息时向订阅客户端发送通知的信息。
还需要注意的是,服务与这些消息的内容无关,并且在发布者和订阅者之间单独进行通信。该服务只需将已发布消息的一些编码传递给所有订阅者,他们知道如何对其进行解码。
还假设希望通过此端点订阅的客户端需要一个 SUBSCRIBER 角色。
现在假设我希望服务提供一个新的主题监控功能:这个新功能的客户端仍然需要指定主题名称列表和通知它的方式,但是这种服务:
1) 将发送有关感兴趣主题的元数据通知。这些通知将传达有关主题的元数据信息,例如:“订阅者 x 已与主题 y 断开连接”,或“订阅者 v 订阅了主题 q”,或“主题 z 上的订阅者数量刚刚降至 3 以下”,或“过去一小时内向主题 w 发送的通知少于 5 条”
2) 此服务的客户端需要 MONITOR 角色。
3) 请注意,这些通知中的消息将是系统定义的消息。所以他们的订阅者可以接收一个服务定义的对象来表示消息数据(例如事件类型、订阅者 ID、主题名称等)。
有两种处理方式:
可以为监控服务创建一个新端点,例如“/messaging/monitor”,具有与现有订阅端点相同的请求对象信息,可能还有其他参数。
或者,现有端点可能会被重载以处理订阅和监视请求,其中差异在附加参数中传达。例如,客户端可以在请求对象中指定一个名为“monitor”的布尔属性。因此,如果请求不包含此“可选”请求属性或其值为 false,则该请求是对主题的正常订阅。或者,如果参数指定monitor==true,则意味着客户端只对与指定主题相关的元数据事件感兴趣。 代码可以根据这个 'monitor' 请求属性的值来检查角色授权。
为了决定这两种选择中的哪一种更可取,应该考虑哪些因素?
没关系,但实现使用 Java 中的 Vertx...
【问题讨论】:
标签: java jax-rs microservices publish-subscribe endpoint