Real Time Connection dengan PostgreSQL + NodeJS

PostgreSQL Node.js Setelah bermain-main dengan websocket menggunakan socket.io  dan manajemen scalable apps, yang jadi pertanyaan adalah saat menggunakan database apakah aplikasi benar-benar real time atau tidak. Sekarang, aplikasi mana yang tidak menggunakan database sama sekali.

Dalam implementasinya ini aku terapkan di aplikasi GPS Tracking yang memilki banyak jenis GPS dan potensi klien dengan custom app, sebelumnya penuh dengan bahasa marketing Real Time Tracking padahal cuma pooling per interval waktu dengan AJAX :D

Logikanya, untuk setiap data baru di-push ke client terkoneksi melalui websocket. Kalau aplikasi biasanya APLIKASI ⇒ AJAX/x detik  DATABASE  APLIKASI  KLIEN / USERS.
Dengan metoda ini:. DATABASE  WEBSOCKET  KLIEN / USERS.
Perbedaannya jelas, AJAX akan tetap request setiap x detik meski tidak ada data baru (notebene menghabiskan resource) sedangkan metoda yg ini, data akan dikirim jika ada data baru aja langsung dari database (dengan heartbeat untuk menjaga koneksi).

Bahasa prosedural yang didukung pgsql sebenarnya banyak dan trusted cuma PERL (PL/PSQL; embedded) dan ada yg lain mungkin tapi ya kurang ngerti bahasa itu. Jadi pake python (PL/PY) aja dan diadaptasi dari blog ini.

SendSocket.sql

-- function SendSocket() to send fix data --
CREATE OR REPLACE FUNCTION SendSocket(prop character varying, geom character varying)
  RETURNS integer AS
$$
  import json
  from socketIO_client import SocketIO
  try:
    geo = json.JSONEncoder().encode(json.loads(geom))
    res = '{"geometry":%s, "properties":%s}' % (geo, prop)
    ws = SocketIO("localhost", 8080)
    ws.emit('pgsql', res)
    return 1
  except:
    raise
    return 0
$$
  LANGUAGE plpythonu VOLATILE;
-- function SendToSocket() - get updated data, prepare and parse to send --
CREATE OR REPLACE FUNCTION SendToSocket()
RETURNS trigger AS
$$
   import json
   try:
      del TD["new"]["gid"]
      geom = TD["new"]["the_geom"]
      del TD["new"]["the_geom"]
      qy = plpy.prepare("SELECT SendSocket( $1, (SELECT ST_AsGeoJSON($2) AS geometry) )", ["text", "geometry"])
      rv = plpy.execute(qy,[ json.dumps(TD["new"]), geom])
   except:
      	raise
$$
LANGUAGE plpythonu VOLATILE;
-- trigger if there's new data --
DROP TRIGGER IF EXISTS sendmetosocket ON nama_tabel CASCADE;
CREATE TRIGGER sendmetosocket
  AFTER INSERT
  ON nama_tabel
  FOR EACH ROW
  EXECUTE PROCEDURE SendToSocket();

Geometry (kolom geom) di PostGIS diconvert menjadi GeoJSON dari WKB, lalu kemudian dikirim ke socket server dengan emitting “pgsql” dan data GeoJSON.

Eksekusi file sql: psql -d nama -U postgres -f SendSocket.sql

Contoh socket server node.js handling “pgsql” data, file server.js:

var io = socket.listen(app);
io.sockets.on('connection', function (socket) {
    socket.on('pgsql', function (data) {
        console.log(data);
    });
    socket.on('disconnect', function () {
        //users disconnected
    });
});

Start: node server

Edit: atau bisa lewat git clone github dan npm install langsung. Caranya lihat di repository github aja deh :)

Nah, sekarang kita punya real time connection yang melibatkan database. Yeeha!!

Leave a Reply