【问题标题】:Calling hooks on all applications connected to a database在连接到数据库的所有应用程序上调用挂钩
【发布时间】:2016-07-05 06:49:21
【问题描述】:

我有两个应用程序连接到同一个数据库。

我写了一个这样的数据库钩子:

def call_side_effect(record)
  puts record
  # my application actually does something more complicated here
end

class Verb
  include DataMapper::Resource
  property :id,         Serial
  property :name,       String
  before(:save) { |record| call_side_effect(record) }
end

这将在创建后打印出记录属性。

如果我在两个应用程序中定义了完全相同的钩子(并且它们都连接到同一个数据库),我可以让它在 两个 应用程序上运行一个其中插入了一条记录?

我正在考虑使用 Pusher,但我想知道是否有办法单独使用 Datamapper 或 ActiveRecord。

我在这里使用 DataMapper 和 SQLite3,但如果需要,可以切换到不同的 ORM / db。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord sinatra datamapper


    【解决方案1】:

    Active Record 的生命周期事件在应用程序级别实现,因此将本地化到应用程序。我建议 Datamapper 以类似的方式工作。如果您想提醒两个不同的应用程序,您将需要某种外部消息系统。如果您需要消息总线,我建议您查看 RabbitMQ。如果您想将内容保存在数据库中,postgresql 有一个名为 NOTIFY(https://www.postgresql.org/docs/9.0/static/sql-notify.html) 的功能,尽管我不确定它如何处理活动记录,但它可能会有一些用处。

    【讨论】:

    • 感谢您的建议。我目前正在努力添加 Faye。
    • 由于我的一个应用程序是命令行脚本,我最终跳过了消息总线服务器并通过标准输入/标准输出传递数据。 Faye 没有工作,rabbitmq 对于这个项目的需求似乎有点太大了
    • 我会小心使用标准输入/标准输出作为消息总线,因为它们是操作系统级别的。您可以发现一些令人讨厌的跨平台问题。您是否考虑过零 MQ?您可以直接传递消息,而无需将单个服务器用作总线。
    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多