我正在阅读RESTful Web Services(OReilly)。作者提到无国籍状态(应用状态与资源状态相对)是ROA的主要特征之一。
在本书的后面,当他以帐户转移的例子来解释交易时,他提到了将交易作为资源公开的选项,而不是重载的POST。
将交易公开为资源: 总结一下这本书:
将50美元从支票(200美元)转入储蓄(200美元) 最终结果:检查(250美元)和储蓄(150美元)
支票帐户资源在/accounts/checking/11
公开,储蓄帐户资源在/accounts/savings/55
POST /transactions/account-transfer HTTP/1.1
Host: example.com
返回
201 Created
Location: /transactions/account-transfer/11a5
支付150美元检查
PUT /transactions/account-transfer/11a5/accounts/checking/11 HTTP/1.1
Host example.com
balance=150
并在储蓄中投入250美元
PUT /transactions/account-transfer/11a5/accounts/savings/55 HTTP/1.1
Host: example.com
balance=250
最后把commit = true
PUT /transactions/account-transfer/11a5/1.1
Host: example.com
committed=true
他说,这可以通过构建与事务关联的操作队列来实现。从书中可以看出:
提交事务时,服务器可能会启动数据库事务,应用排队的操作,然后尝试提交数据库事务。
我的问题是:
是否在服务器状态(应用程序状态)上维护操作队列?因此无国籍状态受到侵犯?
在Kai Mattern的回答后编辑
我认为你所说的是这个动作队列是资源状态而不是应用程序状态。本书也对此进行了区分,并说资源状态为Ok,但不是Application state。
但是当您考虑无状态时,您可以在负载平衡服务器上分发无状态应用程序,上述POST和PUT系列将不允许您这样做。负载均衡器应将所有请求发送到1个特定服务器,因为在该1个服务器上维护了一系列操作。否则,如果将上述资源拆分为驻留在多台计算机上(以启用负载平衡),则可能需要类似RESTful两阶段提交事务。
因此,我们正在考虑2个选项。为此特定示例重载POST无状态应用程序Vs 2阶段提交无状态应用程序。
是这样的吗?
答案 0 :(得分:2)
无国籍状态并不意味着应用程序完全无能为力。它只是意味着应用程序不会通过URL,cookie以及更重要的数据库之外的其他方式记住其状态。
这导致您不应该将数据保存在服务器会话之类的内容中,除非会话信息映射到会话资源之类的内容。
因此,只要动作映射到资源,它就有可能成为无状态。
请注意,映射操作到网址通常会诱使您创建像/ transactions / startTransaction这样的网址操作 - 这是错误的。将资源视为名词 - 而不是动词。
例如:
logging in -> create a session resource
logging out -> delete the session resource
您的示例显示的正是该行为:您创建资源(帐户转移)。您修改它以包含所有相关数据。然后你通过提交它来改变它的状态(是,状态)。
写入提交标志后,后端将处理此事务。这可以通过将事务放入队列来完成。但那部分不是前端的一部分 - 无国籍状态可能会或可能不会止步于此。
所以,回答你的问题:不要将数据状态与应用程序状态混合。维护作为资源的操作队列是无状态的。维护服务器内存(有状态应用程序服务器会话)中的操作不是。