当前位置: 首页 > 分布式系统实战 > 正文

分布式原理与实战(三) 以FDB为例之通信

Q : 很多协议都采用分层模型?为什么?

答:协议的每一层都必须和其它层相独立。从第k+1层传送至第k层的数据同时包含了报头和数据,但是第k层协议不能对它们进行辨别。如果使用单个大的报头来包含所有信息的话将会破坏透明性,使得一个协议层的变动会影响到其它层,这显然不是我们所希望的。FDB作为应用程序,并不需要考虑协议上的东西,但是我们需要考虑消息格式。

Q:为什么传数层往往不适合构建分布式应用程序?

答:他们往往没有透明性。我们在开发应用程序的时候必须自己实现通信,从而导致可扩展性不好,分布式应用程序,如果基于套接字构建的分布式程序,将很难移植或者和其它应用交互。然而FDB就是基于底层套接字的一个程序,我们也需要考虑多语言客户端,多语言客户端。和其它应用交互的功能。

Q:C语言中有一种称为联合(union)的构造,其中的记录(在C语言中称作结构)的字段可以用来保存几种可能值中的一个。在运行时,没有可靠的办法来分辨其中保存的是那一个值。C的这种特性是否与远程过程调用有某些相似之处?请说明理由。

答:如果运行时系统不能分辨一个字段的值类型,它就不能对该字段进行正确的封送处理。除非有一个标签字段用来清楚的表明一个字段的值类型,联合不能在远程过程调用中使用。这个标签字段不能被用户所控制。所以基于消息传递的时候一定要小心设计消息的格式。

Q:假定客户通过异步RPC对服务器进行调用,随后等待服务器使用另一异步RPC返回结果。这种方法与客户端执行常规的RPC有没有什么不同?如果使用的是同步RPC而不是异步RPC,情况又如何呢?

答:二者并不相同。异步RPC向调用者返回一个通知,这意味着客户第一次调用之后,有一个额外的消息会被发送。类似地,服务端接收到它的响应消息已经发送到客户端的通知。如果保证通信可靠的话,两次异步RPC调用是一样的。

Q:通过RPC实现持久化异步通信有意义吗?

答:仅仅在管理了一个队列的进程通过RPC将消息发送给下一个队列管理器时有意义。一个队列管理器为另一个管理器提供的服务是保存消息,调用的队列管理器可以获得远程队列的一个代理对象,并可能接收到每一个操作成功或失败的状态。使用这种方法时,队列管理器看到的仅仅是队列,而不会发生通信。

Q:请说明为什么暂时同步通信在可扩展性方面存在固有的问题,以及如何解决这些问题。

答:问题在于地理上的可扩展性受到了限制。由于同步通信需要调用者被阻塞直到消息被接收,因此,如果接收方相隔较远的话调用者可能需要阻塞很长的时间才能继续运行。解决这个问题的惟一办法是设计调用程序,使得它在发生通信时可以做其它有用的工作,以有效地
实现一种异步通信。

Q:在持久通信中,接收者一般拥有自己的本地缓冲区,如果接收者不在运行状态,可以将消息放入该缓冲区中去,如何做?

答:用户指定缓冲区大小使得实现更加容易。系统创建一个固定大小的缓冲区,之后缓冲区管理会十分容易。但是,如果缓冲区已满,消息可能会丢失。另一种方案是由通信系统来管理缓冲区大小,首先先制定一个默认大小,然后视情况需要扩充或者压缩缓冲区。这种方法减少了由于缺少空间而导致丢失消息的机率,但是需要系统做更多的工作。

本文固定链接: http://zmrlinux.com/2016/09/09/%e5%88%86%e5%b8%83%e5%bc%8f%e5%8e%9f%e7%90%86%e4%b8%8e%e5%ae%9e%e6%88%98%ef%bc%88%e4%b8%89%ef%bc%89-%e4%bb%a5fdb%e4%b8%ba%e4%be%8b%e4%b9%8b%e9%80%9a%e4%bf%a1/ | Kernel & Me

该日志由 root 于2016年09月09日发表在 分布式系统实战 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 分布式原理与实战(三) 以FDB为例之通信 | Kernel & Me