跳至主内容

AtomizeJS:分布式软件事务内存

·3 分钟阅读
Matthew Sackman

AtomizeJS 是一个用于编写分布式程序的 JavaScript 库,这些程序在浏览器中运行,而无需在服务器上编写任何应用程序特定的逻辑。

在 RabbitMQ 总部,我们花费大量时间进行争论。偶尔,这些争论是关于重要的事情,比如“消息传递”到底意味着什么,以及可以用于实现“消息传递”的各种 API。RabbitMQ 和 AMQP 为消息传递提供了一个非常明确的接口:你确实有“发送”和“接收”这两个动词,并且需要考虑你的消息传递模式。在后台有很多(通常很巧妙的东西)在进行,但尽管如此,接口还是相当底层的和明确的,这提供了很好的灵活性。然而,有时这种 API 风格并不是解决你正在解决的问题最自然的方式——你是否真的会陷入僵局并想到“我现在需要的是一个 AMQP 消息代理”,或者你是否会根据先前的知识意识到你可以选择使用 AMQP 消息代理来解决当前的问题?

AtomizeJS 处于光谱的另一端。其中涉及大量消息传递,但您几乎从未看到任何消息。取而代之的是,您将以 JavaScript 编写事务来修改对象,而这些对象将在连接到同一 AtomizeJS 服务器的所有客户端之间共享。您获得的 API 允许您执行比数据库事务更强大的功能,特别是 `retry` 功能,它允许您中止事务,然后在您读取的某个变量被其他人更改后自动重新启动该事务。这意味着您拥有观察者模式,并可以从中构建任何您想要的显式消息传递模式。在大多数情况下,我怀疑您会构建说 _send_ 或 _receive_ 的 API,而是会构建更丰富的数据结构——工作队列、共享字典等。那么要提出的问题是:基于像 AtomizeJS 提供的类似事务的 API 来构建这些东西,或者基于像 RabbitMQ 和 AMQP 代理提供的显式消息 API 来构建这些东西,哪种更容易?没有唯一的解决方案,各有利弊等等,但请在下方留下您的想法。

AtomizeJS 提供的优势并不在于在浏览器中使用 STM,而在于使用 STM 对分布式对象进行操作。这使您可以轻松地在浏览器之间共享状态,以直观的方式安全地修改它,从而用很少或不需要特定于应用程序的服务器端代码来构建您的应用程序。目前,对于不支持最新 JavaScript 功能的浏览器来说,使用起来有点笨拙(尽管我提供了一些工具来尝试缓解这个问题),并且所有这些功能都可以在最新版本的 Chrome、Firefox、IE、Safari 和 Opera 中正常工作。请 尝试一下,并 告诉我们 您的想法!

© . This site is unofficial and not affiliated with VMware.