如何确保信息传送的拉/投票从一个网络服务器
-
26-09-2019 - |
题
这是建立在 如何发送信息之间的公司.如果我决定公司S(upplier)应该调查的命令公司(B)在某些简单HTTP基础的方式是什么,是最佳的执行。
- 我认为B公司拥有的网络服务器运行和后端数据库的这一网络服务器是持久的。我们应该使作为几个可能的假设对储存进程S如果他们能够保持状态(例如名单已经传送Guid)
- 互联网连接之间的B和S是不可靠的。
- 我们必须到达 最终一致性 意义在一个时间点的所有订单B之间的和S应该转移。
什么是最好的实践中实施这样一个系统?
解决方案
一种方法来这样的问题是使用某种类型的队列产品,如IBM的人,我立即考虑MQ。但是我实际上不MQ人自己,就像你我可能会很高兴与基于服务的方法。
有两种可能的方法,来考虑。一种是使用 WS可靠消息, ,从而推动可靠性问题进入网服务基础设施。另一个是手柄你自己的可靠的协议之上的简单,但是不可靠的服务。
我已经没有严重的实际经验的实施一个系统与WS可靠消息,我相信,它可以工作,但它确实需要某种程度的控制的参与者,因为它是一个较新的标准,我们不能保证任何给定的这店里将会有一个执行手和互操作性之间的供应商可能是一个问题。更多的控制我已经在SW堆在每个结束的更倾向,我将不使用WS可靠的信息。[我应该提到WS原子交易过,这也可以被用来建立可靠的服务,同一间运问题适用。]
那么,关于卷,你自己?这里的关键是要让所有服务幂等的。作为我们没有交易可以保证跨越两个系统我们必须假定,任何给定服务的呼吁可能会失败,未知的结果。
我会假设,B想得到确认,已经采取了一个订单,因此我们需要更新信息的两B和S订单时转移。
B必须提供的服务,如:
Give me the next order(s)
I have stored {orders ...}
那么,我们如何定义"下一步"。最简单的情况下工作的很好如果卷我们正在处理的与可以使我们能够有一个单一的"线"的转让。然后B是滴答作响的发送单一的时间,并且该命令有一个单调增加标识。然后我们可以简化:
I have stored order <65,004> please give me the next
注意,这是一个幂等的请求:它可以安全地重复多次。还注意到,S必须预测所可能得到相同的顺序两次,并检查是否有重复。
其他提示
什么你可能寻求的是两个阶段提交。这是很好的描述在互联网,在这里,例如:
http://en.wikipedia.org/wiki/Two-phase_commit_protocol
它的要点:
在提交过程中进行如下:
* Phase 1
o Each participating resource manager coordinates local
operations and forces all log records out:
o If successful, respond "OK"
o If unsuccessful, either allow a time-out or respond "OOPS"
* Phase 2
o If all participants respond "OK":
* Coordinator instructs participating resource managers to "COMMIT"
* Participants complete operation writing the log record
for the commit
o Otherwise:
* Coordinator instructs participating resource managers to "ROLLBACK"
* Participants complete their respective local undos
应该适用于任何种类的数据。
好吧,首先你不能 保证 任何超过一个不可靠的链接。的 两位将军'的问题 证明这对于这两种确定性和不确定性的协议。你所能做的就是减轻不可靠到一个可接受的程度。
最简单的方法是,在你的情况下,一旦服务器接收到调查请求时,它会发送 x
数量的答复,都具有相同的 GUID
.例如。
S: B, anything new?
S: B, anything new?
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
...
S
可能会得到垃圾邮件订单,但由于是发给每个请求,这不是一个大问题。如果我们错过了之前,我们正在得到它了。如果我们没有得到之前,呜呼!我们有现在。该系统的工作原理!你会注意到 B
发送消息 5
次在我的例子。在一个真实的场景你可能会发送一个信息数百或数千倍,直到你有所需的可靠性。
现在,上述解决方案是处理和带宽密集型的,但它的工作。更巧妙的方法是做什么TCP:有三次握手。
S: Hello B. Are you there? -> SYN
B: Hello S, yep I'm here. What's up? -> SYN+ACK
S: Oh good, you're there. -> ACK
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
但是..HTTP已经这样做了。所以如果有什么不得到什么地方,你知道。连接时,连接的爆发,等等。
现在,你可以重新写入这些方案内的用水平(输入它的),但是真的TCP已经是可靠的。一些批评这些肥皂(ish)框架和人造协议(他们工作上的HTTP通常)指责他们本质上是重新发明车轮,该轮的问题--在一个更高的层次的抽象概念。
底线是,任何系统可能失败,包括可靠的通讯系统。
如最终的一致性感到关切的是,我想你可能感到困惑。最终一致性仅适用于分布式存储系统之后 Write()
, 你可能不能够确定性地检索它 Read()
对于一些时间。这似乎并不喜欢你的问题。我的意思是,我看到你在说什么,但在一个 eventually consistent
系统、一个可靠的(足够)连接的假设之间的节点。你不做,假设(即使我认为你应该。。TCP是非常可靠的).
楼上什么,迪娜提到。Web服务将是一个完美的解决上述问题。一些协议可能商定的其定义的量的记录。
S ---> D ( Call a service which would list record keys)
D----> S ( provide xml of keys)
S----> D ( Request each of the records)
D----> S ( Submit record)
在情况下的一个新的记录条目后作出的同步,目的地可以调用的一个服务部署在来源,其中会处理一个新的记录。
由于通信处理买一个网服务机,你不需要担心的消息参数。SSL可以添加的安全。
干杯!
我想你是想说,公司B是一种被动的参与者。S(供应商)只是需要能够得到的所有订单B员额(最终一致性).但是B不需要或不关心什么样的命令已经有(没有必要为提交).
如果公司B有一半的精确时钟,可以使用的日期作为单调增加GUID,根据决议的事-你不会要调查如果您需要毫秒的决议无论如何。你只有使用B的时钟的所以你不必担心同步。如果B将发布的所有订单,S可以拿起的订单,从那里最后一个离开的地方。
我不知道如果你的意思是最好的做法或最佳折衷的一种容易实施的系统。根据量及响应时间,没有需要使它成为一个动态系统,如果你们投票无论如何。转储订单以文本文件(名timestamp)成一个目录,名为的日期,并把他们拉下来的所有(或选择性地).你甚至可以将它们储存在目录,按小时或任何有意义的。HTTP GET是幂等的。
这可能是丑陋的,但它听起来像你不要指望太多复杂的公司B。SSL的使用和认证,它被锁定下来,并加密。
如果你不需要表现没有什么错简单。什么你真的获得自一个复杂的议定书?