Rabu, 06 Agustus 2008

Membangun Hi-Load TCP/IP Server

Fitur TCP/IP dalam delphi dibagi dalam dua aspek, Client dan Server, masing-masing mensupport mode koneksi non-blocked, blocked, dan thread-blocking.
• Modus koneksi non-blocked sangat berguna untuk membuat aplikasi client yang bersifat multitasking, GUI based karena dengan menggunakan modus koneksi non-blocked, aplikasi bisa melakukan hal-hal lain selama proses menerima output yang dikirimkan oleh server. Contoh atas non-blocking connection yang paling jelas terlihat adalah pada aplikasi mail client seperti outlook, ataupun outlook-express dimana user dapat tetap melakukan interaksi dengan aplikasi sementara secara background aplikasi melakukan retrieve email dari server.
• Modus koneksi blocked biasanya digunakan pada aplikasi console based, baik dos-box ataupun console linux, dimana user harus menunggu selama proses transaksi data antara client dengan server. Kendati dengan keterbatasan tersebut, modus Blocked menawarkan implementasi konektifitas secara mudah dan paling terstruktur menurut algoritma pemrograman konvensional.
• Modus Thread-Blocking dalam konsepnya sebenarnya sama halnya dengan modus blocked biasa, hanya saja setiap koneksi dihandle melalui thread. Dengan demikian server mampu menangani lebih dari satu koneksi. Modus ini umumnya digunakan di sisi server karena cukup mudah diimplementasikan daripada non-blocked.
Arsitektur Spesifik sebuah High-Load Server
Pada umumnya Threaded-Blocking, cukup untuk digunakan dalam keperluan membangun sebuah server yang mampu menangani multiple user. Namun berbicara tentang sebuah sistem yang mampu menangani banyak user, maka topiknya akan menjadi berbeda. Implementasi Threaded-Blocking akan membuat server mengalokasikan satu thread setiap satu koneksi, ini berarti jika terdapat 100 user maka server akan membuat 100 thread. Hal ini tentunya sangat tidak efektif, terutama bila dikaitkan dengan implementasi proses pada sebuah hi-load sistem umumnya pendek-pendek untuk memungkinkannya mensupport banyak user dengan cara
|-- Client Side --|------ Server Side-------| connect-request-proses-output-disconnect.
Dengan model transaksi demikian, proses membuat thread untuk masing-masing koneksi kemudian men-destroy-nya ketika koneksi user terputus akan menjadi kurang efisien, dan memakan cukup banyak resource server. akan lebih baik jika membuat sejumlah thread sebagai worker thread secara persisten dan setiap proses akan handle oleh thread-thread tersebut.
Umumnya developer tidak mau ambil pusing untuk melakukan redesign secara low-level seperti ini, melainkan memanfaatkan implementasi server yang memang dirancang untuk kebutuhan sebagai hi-load server, Application Server umumnya menggunakan Apache ataupun IIS sebagai backbone server karena memang HTTPd umumnya dirancang sebagai hi-load server agar mampu mendukung banyak user. Namun HTTPd menggunakan basis text sebagai media komunikasinya, hal ini memungkinkan penurunan performa karena keperluan untuk rutin konversi dan parsing yang cukup banyak.
Windows NT (2000, XP, dst) secara default telah menyediakan Input/Output Completion Port yang dapat digunakan untuk mewujudkan implementasi hi-load server. Dua fungsi WINAPI utama yang digunakan untuk memanfaatkan IOCP adalah GetQueuedCompletionStatus, dan PostQueuedCompletionStatus.
Namun demikian, implementasinya akan menyebabkan sisi client-side harus dimodifikasi agar mampu berkomunikasi dengan server yang memanfaatkan IOCP secara benar. Hal ini dikarenakan IOCP di sisi Server akan memecah sebuah paket besar ke dalam packet-packet yang lebih kecil pada saat dikirimkan ke client.

Tidak ada komentar: