2016-07-04 12 views
1

Ich habe zwei Anwendungen, die sich mit derselben Datenbank verbinden.Aufrufe von allen Anwendungen, die mit einer Datenbank verbunden sind

ich eine Datenbank Haken wie so geschrieben haben:

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 

Und das wird auszudrucken der Datensatz einmal Attribute es erstellt wird.

Wenn ich dies genau die gleichen Haken in zwei Anwendungen definiert haben (und sie verbinden beide auf die gleiche Datenbank), kann ich es auf beiden Anwendungen zu laufen, wenn ein von ihnen einen Datensatz einfügt?

Ich denke an die Verwendung von Pusher, aber ich frage mich, ob es eine Möglichkeit gibt, es mit Datamapper oder ActiveRecord allein zu tun.

Ich verwende hier DataMapper und SQLite3, könnte aber bei Bedarf zu einem anderen ORM/db wechseln.

Antwort

1

Die Life-Cycle-Ereignisse von Active Record werden auf Anwendungsebene implementiert und daher in der Anwendung lokalisiert. Ich würde vorschlagen, Datamapper funktioniert in ähnlicher Weise. Wenn Sie möchten, dass zwei verschiedene Anwendungen alarmiert werden, benötigen Sie eine Art externes Nachrichtensystem. Ich würde vorschlagen, RabbitMQ zu betrachten, wenn Sie einen Nachrichtenbus benötigen. Wenn Sie die Dinge in der Datenbank behalten möchten, hat postgresql eine Funktion namens NOTIFY (https://www.postgresql.org/docs/9.0/static/sql-notify.html), die möglicherweise nützlich ist, obwohl ich nicht sicher bin, wie es mit dem aktiven Datensatz spielt.

+0

Danke für diesen Vorschlag. Ich arbeite gerade daran, Faye hinzuzufügen. –

+0

Da eine meiner Anwendungen ein Befehlszeilenskript ist, habe ich den Nachrichtenbusserver übersprungen und Daten über stdin/stdout übergeben. Faye arbeitete nicht und Rabbitmq scheint ein wenig zu stark für diese Projekte benötigt –

+0

Ich wäre vorsichtig mit stdin/stdout als Nachrichtenbus, wie sie Betriebssystemebene sind. Sie könnten einige böse Cross-Plattform-Probleme aufdecken. Hast du über Zero MQ nachgedacht? Sie können Nachrichten direkt weitergeben, ohne dass ein einziger Server als Bus fungiert. – Stewart