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
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!!
