AtomizeJS:分布式软件事务内存
AtomizeJS 是一个用于编写分布式程序的 JavaScript 库,该程序可以在浏览器中运行,无需在服务器上编写任何特定于应用程序的逻辑。
在 RabbitMQ 总部,我们花了很多时间争论。有时,是关于重要的事情,比如消息传递的真正含义,以及可以用来实现消息传递的不同 API 的范围。RabbitMQ 和 AMQP 为消息传递提供了非常明确的接口:您非常有发送和接收动词,您需要考虑您的消息传递模式。在引擎盖下有很多(通常非常聪明的东西),但尽管如此,接口仍然是相当低级的和明确的,这提供了高度的灵活性。但是,有时这种类型的 API 并不是您要解决的问题的最自然契合 - 您是否真的遇到了僵局并认为“我这里需要的是 AMQP 消息代理”,或者您是否从先前的知识中意识到您可以选择使用 AMQP 消息代理来解决当前的问题?
AtomizeJS 存在于光谱的另一端。它涉及大量消息传递,但您几乎看不到任何消息传递。相反,您用 JavaScript 编写事务来修改对象,而这些对象在连接到同一 AtomizeJS 服务器的所有客户端之间共享。您得到的API 允许您做比您习惯于数据库事务中做的事情更强大的事情,特别是,retry
允许您中止事务,但随后在其他人更改了您读取的变量后自动重新启动它。这意味着您拥有观察者模式,从该模式中,您可以构建任何您想要的显式消息传递模式。在大多数情况下,我怀疑您将构建的 API 不会说发送或接收,而是构建更丰富的数据结构 - 工作队列、共享字典等。那么要提出的问题是:基于 AtomizeJS 提供的类似事务的 API,还是基于 RabbitMQ 和 AMQP 代理提供的显式消息传递 API,构建这些东西更容易。没有一个解决方案,而且适合不同的情况,但请在下面留下您的想法。
AtomizeJS 提供的优势不在于浏览器中使用 STM,而在于对分布式对象的 STM 的使用。这允许您在浏览器之间轻松共享状态,以直观的方式安全地修改它,从而用很少或根本没有特定于应用程序的服务器端代码来构建您的应用程序。目前,它在不支持尖端 JavaScript 功能的浏览器中使用起来有点笨拙(虽然我已经提供了一些工具来尝试缓解这种情况),并且所有功能都可以在最新版本的 Chrome、Firefox、IE、Safari 和 Opera 中使用。请尝试一下并告诉我们您的想法!