不是一个具体的问题,我更想试水。我喜欢分布式对象,我喜欢宏大的中央调度;我试着把两者结合起来怎么样?
这甚至有意义吗?有人在这些水域玩过吗?我可以使用 GCD 来帮助同步跨机器的对象访问吗?还是坚持只同步本地对象会更好吗?我应该注意什么?哪些设计模式有帮助,我应该避免什么?
例如,我使用 GCD 队列来同步对某种共享资源的访问。如果我通过分布式对象将此资源公开,会发生什么?像这样的问题:块玩分布式对象有多好?我可以期望在机器上正常使用一切吗?如果没有,我可以争取这样做吗?我会遇到什么困难?
不是一个具体的问题,我更想试水。我喜欢分布式对象,我喜欢宏大的中央调度;我试着把两者结合起来怎么样?
这甚至有意义吗?有人在这些水域玩过吗?我可以使用 GCD 来帮助同步跨机器的对象访问吗?还是坚持只同步本地对象会更好吗?我应该注意什么?哪些设计模式有帮助,我应该避免什么?
例如,我使用 GCD 队列来同步对某种共享资源的访问。如果我通过分布式对象将此资源公开,会发生什么?像这样的问题:块玩分布式对象有多好?我可以期望在机器上正常使用一切吗?如果没有,我可以争取这样做吗?我会遇到什么困难?
我非常怀疑这是否会奏效。GCD 对象不是 Cocoa 对象,因此您不能远程引用它们。GCD 同步原语不能跨进程边界工作。
虽然块是对象,但它们不支持NSCoding
,因此它们不能跨进程边界传输。(如果你仔细想想,它们只不过是函数指针。指向的函数必须已经编译到可执行文件中。所以,两个不同的程序共享一个块是没有意义的。)
此外,分布式对象取决于在给定运行循环中调度的连接。由于您不管理 GCD 使用的线程,因此您无权添加运行循环源,除非是临时的。
坦率地说,我什至不确定你如何设想它甚至在理论上有效。你希望做什么?你预计它会如何运作?
跨机器运行——例如在 LAN、MAN 或 WAN 中?
在 LAN 中,只要您连接的服务器正常运行,分布式对象就可以正常工作。但是,您遇到的大多数程序员可能会扬起眉毛,然后问您:“您为什么不直接在 LAN 上使用 Web 服务器并构建自己的包装类,让它‘感觉’像分布式对象?” 我的意思是,一方面,有一些完善的工具可以对 Web 服务器进行故障排除,而且雇用某人为您构建 Web 服务而不是分布式对象服务器更容易而且通常更便宜。
然而,在 MAN 或 WAN 上,这会很慢,并且对于大多数用途来说是一个非常糟糕的主意。对于这种类型的通信,您最好使用其他人都使用的东西——带有 HTTPS/HTTP 的类似 REST 的 API,来回发送 XML、JSON 或键/值数据。因此,您可以制作一个类包装器,使这种“感觉”有点像分布式对象。我的直觉告诉我,您需要使用技巧来加快速度,例如在客户端本地缓存数据块,这样您就不必一直从服务器获取数据,甚至在服务器上缓存它不必经常与数据库交互。
GCD、分布式对象、Mach 端口、XPC、POSIX 消息队列、命名管道、共享内存和许多其他 IPC 机制实际上只对同一台计算机上的本地应用程序到应用程序通信最有意义。如果您想利用它,它们还具有特权提升的额外优势。(注意,我说的是 POSIX 消息队列,它是特定于工作站的。您仍然可以在 LAN、MAN 或 WAN 上使用“消息队列服务”——有很多产品可用。)