在微服务中,端点重载与分离端点
In microservices, endpoint overloading vs. separate endpoints
这个问题类似于method overloading vs optional parameter
但 1) 它与服务端点相关,以及 2) 可选参数可能表示不同的语义:
假设我在我的服务中提供了一个端点,比如说“/messaging/subscribe”,它基本上允许客户端订阅一些主题。因此,订阅请求对象可能包含主题名称列表和足以让服务在向订阅主题之一发布消息时向订阅客户端发送通知的信息。
同样重要的是要注意该服务与这些消息的内容无关,并且在发布者和订阅者之间单独进行通信。该服务只需要将已发布消息的一些编码传递给所有订阅者,他们知道如何对其进行解码。
还假设希望通过此端点订阅的客户端需要 SUBSCRIBER 角色。
现在假设我希望该服务提供一个新的主题监控功能:这个新功能的客户端仍然需要指定一个主题名称列表和通知它的方式,但是这种服务:
1) 将发送有关感兴趣主题的元数据通知。这些通知将传达有关主题的元数据信息,例如:"subscriber x has been disconnected from topic y"、或"subscriber v subscribed to topic q"、或"the number of subscribers on topic z just dropped below 3"、或"there have been less than 5 notifications sent to topic w in the last hour"
2) 此服务的客户端需要 MONITOR 角色。
3) 请注意,这些通知中的消息将是系统定义的消息。因此他们的订阅者可以接收表示消息数据(例如事件类型、订阅者 ID、主题名称等)的服务定义对象。
有两种处理方式:
可以为监控服务创建一个新端点,例如“/messaging/monitor”,具有与现有订阅端点相同的请求对象信息,可能还有其他参数。
或者,现有端点可能会过载以处理订阅和监视请求,其中差异在附加参数中传达。例如,客户端可以在请求对象中指定一个名为 "monitor" 的布尔属性。因此,如果请求不包含此 "optional" 请求属性或它的值为 false,则该请求是对主题的正常订阅。或者,如果参数指定 monitor==true,则意味着客户端只对与指定主题相关的元数据事件感兴趣。
代码可以根据此 'monitor' 请求属性的值检查角色授权。
为了决定两种备选方案中哪一种更可取,应该考虑哪些因素?
这并不重要,但实现在 Java...
中使用了 Vertx
我认为核心问题是是否仍然是相同的操作(不同的参数)。这从操作的语义上应该很清楚。
从我在你的问题中读到的内容来看,订阅似乎与订阅 + 监控有很大不同。
添加 monitor
参数不仅实质上改变了发生的事情,而且还改变了 return 类型等
所以我的投票转到了一个新的端点。
这个问题类似于method overloading vs optional parameter 但 1) 它与服务端点相关,以及 2) 可选参数可能表示不同的语义:
假设我在我的服务中提供了一个端点,比如说“/messaging/subscribe”,它基本上允许客户端订阅一些主题。因此,订阅请求对象可能包含主题名称列表和足以让服务在向订阅主题之一发布消息时向订阅客户端发送通知的信息。
同样重要的是要注意该服务与这些消息的内容无关,并且在发布者和订阅者之间单独进行通信。该服务只需要将已发布消息的一些编码传递给所有订阅者,他们知道如何对其进行解码。
还假设希望通过此端点订阅的客户端需要 SUBSCRIBER 角色。
现在假设我希望该服务提供一个新的主题监控功能:这个新功能的客户端仍然需要指定一个主题名称列表和通知它的方式,但是这种服务:
1) 将发送有关感兴趣主题的元数据通知。这些通知将传达有关主题的元数据信息,例如:"subscriber x has been disconnected from topic y"、或"subscriber v subscribed to topic q"、或"the number of subscribers on topic z just dropped below 3"、或"there have been less than 5 notifications sent to topic w in the last hour"
2) 此服务的客户端需要 MONITOR 角色。
3) 请注意,这些通知中的消息将是系统定义的消息。因此他们的订阅者可以接收表示消息数据(例如事件类型、订阅者 ID、主题名称等)的服务定义对象。
有两种处理方式:
可以为监控服务创建一个新端点,例如“/messaging/monitor”,具有与现有订阅端点相同的请求对象信息,可能还有其他参数。
或者,现有端点可能会过载以处理订阅和监视请求,其中差异在附加参数中传达。例如,客户端可以在请求对象中指定一个名为 "monitor" 的布尔属性。因此,如果请求不包含此 "optional" 请求属性或它的值为 false,则该请求是对主题的正常订阅。或者,如果参数指定 monitor==true,则意味着客户端只对与指定主题相关的元数据事件感兴趣。 代码可以根据此 'monitor' 请求属性的值检查角色授权。
为了决定两种备选方案中哪一种更可取,应该考虑哪些因素?
这并不重要,但实现在 Java...
中使用了 Vertx我认为核心问题是是否仍然是相同的操作(不同的参数)。这从操作的语义上应该很清楚。
从我在你的问题中读到的内容来看,订阅似乎与订阅 + 监控有很大不同。
添加 monitor
参数不仅实质上改变了发生的事情,而且还改变了 return 类型等
所以我的投票转到了一个新的端点。