客户端服务器设计问题:维护两者的状态

时间:2010-02-26 20:10:05

标签: java web-services client-server

感谢您抽出宝贵时间来审核我的问题!

让我们假设有一个Web服务(restful,SOAP,XML / JSON,你想要的东西),这是一个关于小狗的服务。出于这个问题的目的,小狗可以有两个成员变量。第一个是小狗的唯一ID。另一个数据成员是“跳蚤数量”(Flea Count)。

小狗服务提供的功能之一可能是“根据小狗的ID返回代表小狗的物体。”

您如何处理客户端应用程序可以更新跳蚤计数的要求?以下是我一直想到的一些想法:

  1. 您是否让客户端在客户端更新小狗的跳蚤计数,然后将整个对象发送回服务,以便更新其状态?
  2. 您是否创建了一个接收小狗ID和新跳蚤计数的方法,以便将客户端与服务器同步,但不发回任何内容?
  3. 您是否创建了一个接收小狗ID和新跳蚤计数的方法,但让服务响应整个更新的对象,然后在客户端替换现有的小狗(哦不!)?
  4. 您是否创建了一个接收小狗ID和新跳蚤计数的方法,该方法会更新服务器,但客户端必须调用与ID返回小狗对象相关联的方法,并取代客户端的小狗(消灭了这个想法!)?
  5. 其他?
  6. 感谢。

4 个答案:

答案 0 :(得分:1)

取决于您的架构设计 - 确实没有一个正确的答案:

1)这听起来像是使用“移动对象”,即整个对象(包括逻辑)可以被序列化并通过线路发送。它也可以被视为没有逻辑的DTO(数据传输对象)。

2)这听起来更多SOA - SOA专注于使服务提供客户端可以使用的直观方法。如果该方法的名称类似于UpdatePuppyFleaCount(puppyId,fleaCount),那么它是有道理的。

3)这也是SOA',但实际上是模糊的,因为它既是Update又是Read操作(如果发送更新的Puppy对象并且服务器使用已提交的Puppy对象响应,则会更有意义 - 客户端必须知道交换,但这并不罕见)。

4)这实际上与用例有关。如果你希望更新跳蚤计数而不对小狗做任何其他事情,那么它是有道理的。如果您希望在更新跳蚤计数后始终与小狗一起工作,那么要求客户端进行两次调用(Web服务调用很慢)是一种糟糕的设计。

5 - 倒数4(读小狗,将小狗实例和新跳蚤计数传递给服务器,获取更新小狗):同样,这更多地取决于用例。如果可能会从UpdateFleaCount()操作中单独使用Read操作(即,您在检索小狗后并不总是想要更新跳蚤计数),那么它很适合。


扩展我对“不是一个正确的答案”的评论......我创造了“银弹规则”(尽管我很确定有人值得注意的是很久以前就打败了我)在编程中从来没有银弹;你总是要权衡不同方法的利弊,成本/收益。关键在于识别和理解不同方法之间的差异

答案 1 :(得分:1)

每个小狗实例都在服务器上维护,服务应该公开获取和设置并刷新puppycount的方法。

答案 2 :(得分:0)

Number 2,修改为返回一个布尔结果,表明更新成功或未成功

答案 3 :(得分:0)

这里还有一些问题(!)。

同一只小狗是在多个客户上举行的吗?如果是这样,那么您可能需要向每个客户广播一个更新,以便在跳蚤更新时刷新它的小狗。

您通常会给客户端一个不可变对象(小狗)。客户端可以更新小狗并确保它仍然是一个有效的对象吗?这不是一个愚蠢的问题 - 客户经常被给予DTO(数据传输对象)并可以随意设置字段。一个适当的对象将确保有效性。

带宽重要吗?你能处理在你的网络上发布多只小狗吗?如果第一个问题的答案是“是”,这一点尤其重要。

鉴于上述情况,我可能会在服务器上调用一个请求对小狗X进行跳蚤更新的方法。服务器可以执行此操作(带有相关的验证),并向所有感兴趣的各方发布更新。更新可能包含一个新的小狗对象(根据您的使用情况,您可能会发布X已更新的小狗,如果感兴趣,客户可以获取新小狗 - 也许这是一个优化太远了)