Bagaimana mendevelop aplikasi yang begitu banyak fiturnya?

multi process apps.jpg

Saya mau bercerita bagaimana saya bisa mendevelop bot telegram dengan fitur yang begitu banyaknya. Telegram sendiri merupakan aplikasi perpesanan instan yang mengizinkan developer untuk mengintegrasikan program mereka ke telegram, dan telegram memberikan dukungan penuh terhadap ini termasuk penyediaan Akun bot, dan layanan API untuk mengintegrasikan program.

Semua orang bisa membuat bot telegram, di karenakan API telegram ini terbuka secara publik dan dapat di akses di core.telegram.org, namun di butuhkan sedikit waktu untuk mempelajari mekanismenya, karena begitu banyak sekali dokumen yang bersifat abstrak tidak terstruktur dan tidak ada contoh-contoh penggunaan, hanya saja ada mekanisme untuk membuat program nya.

Tantangan dalam membuat bot telegram adalah menampilkan data, dan juga input data. Kenapa input output ( io ) jadi rumit? Ini karena telegram hanya dapat memproses satu input dalam waktu yang sama, misalnya jika kita membutuhkan sebuah formulir yang berisikan data A - B - C - D, telegram hanya dapat memfasilitasi satu input dalam satu waktu.

Kunci terbaiknya adalah kita memasang kunci untuk memproses setiap input sehingga ketika pesan di kirim, maka akan menginput pesan A kemudian pesan B, kemudian pesan C dan seterusnya. Tapi, tantanganya ketika input A salah sementara program nya sudah mau melanjutkan, kita tidak bisa rollback ke belakang, kecuali kita desain fitur nya.

Selain itu telegram juga tidak mempunyai kemampuan menampilkan data dalam jumlah banyak, asumsikan jika ada lebih dari 1024 karakter, itu tidak dapat di kirim langsung dalam satu pesan, sebaliknya jika menyematkan gambar maka hanya boleh  500 karakter saja.

Tantangan selanjutnya adalah traffik yang datang dari telegram ini sangat tinggi, saya pernah lihat ada 100 pesan per detik ketika bot telegram di pakai untuk menghandle GRUP telegram. Ini merupakan sebuah tantangan karena koneksi HTTPS ke server telegram letkanya terlalu jauh, hingga memakan latency  400-500 mili detik setiap permintaan ke server telegram.

Satu-satunay solusi adalah menggunakan fitur socket server di bandingkan menggunakan HTTPS, fitur socket dapat di pakai ketika kita menggunakan library telethon di telegram. Permasalahanya adalah pada modularity, karena program yang akan di buat sangatlah banyak, dan juga kita harus terhubung ke instance lain API eksternal seperti layanan pembayaran, dan lain-lain.

 

Jadi kunci dan solusinya adalah dengan menggunakan bahasa pemrograman PHP, kalau pengen lebih cepat lagi kita bisa menggunakan bahasa pemrograman dari JavaScript dengan runtime nodejs atau bun. Konsepnya sederhana, yaitu menerima event melalui long poling lalu kemudian memberikan respon segera atas event tersebut.

Karena ada banyak program yang akan berjalan, satu program dapat memfasilitasi lebih dari 100.000 permintaan per hari per pengguna, itu artinya kita harus mendesain dengan multi process. Jadi setiap satu user membuat proses mereka sendiri untuk menangani berbagai permintaan dari telegram sendiri.

Nah satu proses ini gak akan sanggup untuk memproses permintaan dalam jumlah banyak, mislanya dalam 1 menit ada 1000 pesan yang butuh di proses, pastinya akan delay lama banget untuk memproses nya saja di butuhkan sekitar beberapa mili detik. Nah solusinya di sini menggunakan asingkronous processing, kita memproses pesan tanpa memblokir thread utama.

Misalnya threads utama  memproses pesan dari yang datang, ia akan melempar ke sistem yang memprosesnya, tanpa memblokir thread utama, sementara itu dalam event loop yang sama ketika proses lainya berjalan dia akan mengembalikan callback untuk lanjut ke pemrosesan berikutnya, ini terus di lakukan. 

Ya kebanyakan bot telegram di buat dengan metode asingkron, akan tetapi bot telegram dapat juga mengalami lag atau delay ketika jumalah pesan yang masuk terlalu banyak, hingga memenuhi ambang batas API sistem. Ini bisa menyebabkan serangkaian tunda begitu lama, biasanya ada orang jahil yang dengan senagaja mengoperasikan akun bot spam untuk membuat bot lumpuh.

Mereka mengirim pesan per detik dengan banyak AKUN, hingga per detiknya bisa banjir lebihi dari 100 pesan kalau mereka menggunakan banyak akun. Meskipun kita mengabaikan event pesan dari ID terkait,  proses untuk mengabaikan ini tetap memakan waktu nol koma nol nol per sekian mili detik, kalau banyak itu bisa jadii 1 mili detik.

Kita kembali lagi ke topik, jadi intinya adalah satu program kita bangun jadi beberapa proses independen uuntuk setiap user. Gak penting di mana server nya di jalankan yang penting databsenya terdecentralisasi, gak mungkinlah satu bot pakai database mandiri, terlalu banyak sumber daya yang di gunakan, pastinya akan repot melakukan maintenance.

Lalu untuk interface Web yang mengelolah data bot tersebut terhubung langsung ke database utama untuk mengelolah semua data-data nya. Kita kelolah menggunakan HTML5, JavaScript, dan juga CSS untuk memformat UI yang lebih enak di pandang dan tentunya Mobile Friendly.

Banyak di luaran sana yang masih menyediakan jasa bot telegram satu program satu UI, kalau saya sudah menghentikan kegiatan tersebut, karena kalau kita ada banyak bot maka akan kesulitan dalam memanajerial data dalam bot tersebut. Selainn itu biaya nya juga mahal, kalau setiap bot ada panel sendiri, ada UI sendiri ada processor sendiri mahal banget.

Kalau teman-teman pernah bermain dengan Bot WhatsApp pasti pernah menggunakan multi service, satu service menggunakan PHP FPM sebagai pemroses untuk sisi web nya, satu service bertugas untuk server WWEB.js ( whatsapp web js ), keduanya dapat di jalankan di satu server yang sama.

 

Masih belum paham gimana konsepnya?

Gini, setiap kode yang kita buat di simpan dalam folder tertentu dalam bentuk arsip zip, ini udah termasuk defensi yang di butuhkan. Adapun defensi yang di butuhkan sudah di install saat program pertama kali di pindahkan ke sistem operasi baru, jangan heran kalau file zip arsipnya ini agak sedikit gede, tapi gak gede-gede banget untuk linux.

Saat ada pengguna mencoba menginstall program kita buat folder baru di dalam dokumen level aplikasi misalnya di root/data/user/user/Programs/UUID, nanti unpack aja arsipnya ke situ. Python dan nodejas mempunyai perilaku yang sama, kalau nodejs defensi langsung dapat di akses dalam folder yang sama, kalau python kita menggunakan variabel lingkungan virtual yaitu venv untuk mengisolasi defensi.

Sekarang user dapat mengkonfigurasi config terkait meskipun bot nya di jalankan, karena di fasilitasi oleh PHP FPM untuk menulis ke folder target root/data/user/user/Programs/UUID, nah saat user pertama kali menjalankan program, itu akan membuat program jadi berjalan secara damon process.

Satu pengguna satu proces terpisah, jadi gak ada pengaruh untuk satu user dan satu lainya. Akan tetapi, sebuah jembatan komunikasi yang di bangun biasanya kan mengarah ke domain utama misalnya sample.com/apis/bot/UUID. Bagaimana kita menangani hal tersebut dan mengarahkan ke program yang berjalan?

Ada dua pendekatan, menggunakakn socket tingkat PHP di mana PHP fpm masih berfungsi mengirim data ke program dengan IP dan portnya menggunaakan server socket, atau di arahkan secara langsung menggunakan Mod Proxy di Apache sejenis proxy lain untuk mengarahkan permintaan ke program terkait.

Tapi saya lebih memilih menggunakan PHP, karena harus melewati authentikasi dulu. Kalau di proxy langsung, nanti user lain punya akses ke program tersebut, karena program latar belakang atau bot daemon tidak di lengkapi dengan authentikasi. Authentikasi hanya berjalan dari tingkat dashboard aja, makanya saya pake PHP untuk mengkomunikasikan transfer data antara program yaitu program dari browser ke program bot.

Sebagian langsung tembak database alias tidak melalui jaringan socket yang sudah di bangun, ini lebih effisien dan dapat bekerja di saat server bot belum di jalankan.

 

Di sini mungkin ada yang bertanya kenapa PHP selalu aja di pake, karena saya butuh sebuah program yang dapat mengekseksui program tanpa harus repot memantau proses latar belakang daemonizing. Bisa saja saya buat satu proses event driver arcitecture di bandingkan parallel process untuk dashboardnya, tapi PHP with FPM effisien dalam eksekusi karena menggunakan konsep parallel process.

Lagian effisien juga ketika maintenance, gak perlu menonaktifkan server, langsung timpa file lama dengan file baru otomatis akan mempengarughi program. Oke paham kan, terus ada lagi yang tanya kenapa masih pake nodejs atau python?

Jawaban saya adalah karena PHP masih punya keterbatasan dalam mengembangkan bot telegram tingkat tinggi, saya gak bisa pake asingkronous, saya gak bisa mengakses level akun di telegram, dan banyak lagi. Telegram itu traffiknya tinggi sekali, kalau pakai PHP CLI ya repot memproses data sebanyak itu, sementara itu kalau pakai PHP FPM terkadang ada kendala dari server tele ke server kita yang menyebabkan penundaan lebih lama.

Biasanya telegram menampilkan error invalid response from server, biassanya itu terjadi ketika timeout. Kenapa timeout? Karena kegiatan PHP itu masih bersifat blocking, misalnya kita beli diamon cek ke api bank, cek ke api games, cek lagi ke api payment jadi terlalu banyak koneksi api membuat timeoutnya tinggi.

Dengan even driven architecture, saya bisa bikin asingkronous programing, di mana proses utama tetap bisa menhandle proses baru tanpa terganggu, dan menggunakan promise atau callback untuk menangani yang udah selesai.