Server, Serverless, dan Container — Lapisan Server Aplikasi

Artikel ini adalah bagian dari kursus Dasar-Dasar Teknologi Informasi, yang membangun dari nol pengetahuan TI praktis yang minimal kamu butuhkan untuk memprogram dan melakukan vibe coding.
Perbedaannya adalah berapa lama program yang mengerjakan tugasnya tetap berjalan. Diagram membantu kamu membedakan bentuk yang terus berjalan sambil menunggu, bentuk yang berjalan hanya saat ada request, dan container, yang berjalan bersama runtime-nya sendiri di atas satu OS.

Artikel ini membahas 3 bentuk untuk menjalankan lapisan server aplikasi.

Ketiganya adalah selalu aktif, yang membiarkan satu server terus berjalan; serverless, yang berjalan hanya saat ada request; dan container.

Perbedaannya adalah berapa lama program yang mengerjakan tugasnya tetap berjalan.

Karena waktunya berbeda, cara menambah kapasitas saat request bertambah dan hal yang harus kamu siapkan sendiri pun ikut berbeda.

Tiga cara menjalankannya, dipilah berdasarkan berapa lama ia tetap berjalan
Menjalankanlapisan server appTetap jalan tanpaada requestJalan hanya saatada requestSelalu aktifContainerServerless
Dari satu simpul di kiri, pemilahannya adalah apakah ia harus tetap berjalan ketika tidak ada request. Yang atas terus berjalan; yang bawah berjalan hanya ketika dipanggil.

Server yang selalu aktif terus berjalan dan menunggu request

Kamu tidak pernah tahu kapan sebuah request akan datang, jadi kamu menjalankan server.js lebih dahulu dan membiarkannya menunggu sebagai proses (process, yaitu satu program yang sudah dijalankan dan sedang berjalan).

Membiarkan proses itu tetap ada alih-alih mengakhirinya disebut selalu aktif (always-on, yaitu membiarkan program tetap berjalan supaya bisa menerima request kapan saja).

Server listening on port 3000
Press Ctrl+C to stop

Baris pertama menunjukkan bahwa ia sedang mendengarkan request pada nomor port yang kamu pilih.

Seperti kata baris kedua, prosesnya tidak berakhir sampai kamu melakukan tindakan untuk menghentikannya.

Yang datang pada jam ituProses server.jsYang kembali ke lapisan server Web
9:00 kamu menjalankannyaHidup dan mulai mendengarkanBelum ada yang kembali
9:05 request ke /reservationsMenerimanya apa adanya dan mencari data reservasi3 reservasi
9:06 tidak ada yang datangTerus menunggu, tidak berakhirTidak ada yang kembali
Apa yang ada di dalam server yang terus berjalan
Komputer yang kamu jalankan terus
Proses node (dijalankan dengan node server.js)
  • Mendengarkan request di port 3000
  • Tidak berakhir sampai kamu melakukan tindakan untuk menghentikannya
server.js — file berisi pemrosesan aplikasi reservasi
  • Berisi penanganan untuk request yang datang ke /reservations
  • Menanyakan jumlah reservasi ke lapisan database
OS, dan node yang kamu pasang sendiri
  • node kamu pasang dari situs resminya
  • Pembaruan OS juga kamu lakukan sendiri
Kotak luar adalah komputer yang kamu jalankan terus. Di dalamnya proses node mendengarkan, dan di dalam proses itu server.js yang kamu tulis dimuat.

server.js yang paling dalam bukan satu-satunya yang kamu siapkan sendiri.

Komputer yang kamu jalankan terus, OS di atasnya, dan node juga kamu siapkan sendiri.

Inilah perbedaan besarnya dengan serverless, yang dibahas berikutnya.

Di dalam kotak itu ada satu mesin yang kamu siapkan dan kamu jalankan terus.

Prosesnya tidak berakhir selama tidak ada request yang datang; ia menunggu dengan port tetap terbuka.

Selalu aktif berarti tetap berjalan sampai kamu menghentikannya

Server yang selalu aktif adalah server yang kamu jalankan lebih dahulu lalu kamu biarkan menunggu request datang.

Yang menjalankannya adalah node server.js, prosesnya tidak berakhir sampai kamu melakukan tindakan untuk menghentikannya, dan komputer yang kamu jalankan terus, OS, serta node kamu siapkan sendiri.

Serverless menjalankan pemrosesan hanya ketika ada request datang

Pada serverless (yaitu bentuk yang program pemrosesannya berjalan hanya ketika request datang dan berhenti setelah pemrosesannya selesai), kamu tidak menjalankan sendiri proses yang menunggu.

Yang kamu daftarkan adalah satu file seperti handler.js, dan satuan pendaftarannya disebut "fungsi".

Pada serverless, apa yang disiapkan penyedia dan apa yang kamu taruh di sana
Sistem penyedia cloud
Bagian yang menerima request dan memanggil fungsinya
  • Menerima request yang datang
  • Menentukan berapa banyak yang berjalan sekaligus
Runtime yang disiapkan untuk setiap request
  • OS dan node disiapkan penyedia
  • Berhenti setelah pekerjaannya selesai
handler.js — file berisi pemrosesan aplikasi reservasi
  • Hanya menangani satu request yang datang ke /reservations
  • Ada batas atas untuk berapa lama ia boleh berjalan
Kotak luar adalah sistem penyedia cloud. Kotak atas adalah bagian yang menerima request, dan bagian itu selalu berjalan. Kotak bawah adalah runtime yang disiapkan untuk setiap request, dan handler.js milik kamu berada di dalamnya.

Satu-satunya yang kamu sentuh adalah handler.js yang paling dalam.

Kotak-kotak di luarnya disiapkan penyedia, dan pembaruan OS serta node juga dilakukan penyedia.

Siapa menyiapkan apa dibahas di artikel tentang on-premises, server sewaan, dan cloud.

Selama belum ada request yang datang, handler.js tidak berjalan.

Runtime disiapkan untuk setiap request dan berhenti begitu jawabannya dikembalikan.

Inilah perbedaannya dengan selalu aktif, yang tetap berjalan sampai kamu menghentikannya.

Serverless berjalan hanya ketika dipanggil

Serverless adalah bentuk yang menjalankan pemrosesan setelah request datang dan menghentikannya begitu jawabannya dikembalikan.

Satu-satunya yang kamu taruh di sana adalah handler.js, dan runtime yang menjalankannya disiapkan penyedia untuk setiap request.

Cara menambah kapasitas saat request bersamaan bertambah pun berbeda

Jumlah request yang datang bersamaan berubah menurut waktunya.

Menyesuaikan diri dengan hal itu disebut scaling (yaitu menambah atau mengurangi jumlah pihak yang mengerjakan sesuai banyaknya request).

Kita mulai dari bentuk ketika 3 request datang bersamaan ke serverless.

Ketika 3 datang sekaligus, 3 runtime pun ikut menyala
Request dari Ake /reservationsRequest dari Bke /reservationsRequest dari Cke /reservationsPenerima requestmilik penyediaRuntime 1handler.js jalanRuntime 2handler.js jalanRuntime 3handler.js jalan
Ketiganya di kiri sama-sama request ke /reservations yang sama. Setelah bagian tengah menerimanya, satu runtime disiapkan untuk setiap request.

Sampai batas jumlah yang ditetapkan penyedia untuk berjalan sekaligus, tidak ada request yang dibiarkan menunggu.

Kamu juga tidak melakukan apa pun untuk menambah kapasitas.

Server yang selalu aktif membutuhkan peran yang sama, tetapi pihak yang mengisinya berbeda.

Apa yang mengisi peran yang sama pada selalu aktif dan pada serverless
===MenunggurequestProses nodemenunggu di 3000Bagian penerimamilik penyediaMenjalankan kodeserver.js jalan diproses yang samaSiapkan runtimeuntuk handler.jsMenambah jumlahKamu menambahproses atau mesinSistem penyediayang menambah
Kolom kiri adalah perannya, kolom tengah adalah server yang selalu aktif, dan kolom kanan adalah serverless. Dua hal yang dihubungkan garis ganda mengerjakan hal yang sama; hanya pelakunya yang berbeda.

Yang berubah adalah apakah kamu sendiri yang memutuskan menambah kapasitas atau menyerahkannya ke sistem penyedia.

Setelah jumlahnya bertambah, request dari orang yang sama tidak selalu sampai ke pihak yang sama, jadi stateless menjadi keharusan, yaitu satu kali pemrosesan tidak menyimpan nilai yang diingat dari pemrosesan sebelumnya.

Apakah request kedua bisa membaca nilai yang diingat request pertama itu tergantung di mana kamu menaruh nilai tersebut.

Nilai yang juga kamu pakai pada request berikutnya disimpan ke lapisan database lalu dibaca kembali dari sana.

Hal yang sama berlaku di server yang selalu aktif: begitu kamu menambah proses, nilainya tidak tersisa di proses yang lain.

Cara menambah kapasitas, dan tempat menaruh nilai

Ketika request bersamaan bertambah, pada selalu aktif kamu sendiri yang menambah kapasitas, sedangkan pada serverless sistem penyedia yang melakukannya untuk kamu.

Setelah jumlahnya bertambah, dua request dari orang yang sama belum tentu dijawab pihak yang sama, jadi nilai yang ingin kamu pakai lagi ditaruh di lapisan database, bukan di memori lokal.

Container berjalan di atas satu OS, dan kamu memilih di antara ketiganya berdasarkan apakah kamu perlu selalu aktif

Bentuk ketiga, yaitu container (format yang membungkus aplikasi, runtime-nya, dan file yang dibutuhkannya menjadi satu lalu menjalankannya di komputer lain dengan susunan yang sama), berjalan selama waktu yang sama dengan server yang selalu aktif.

Yang berbeda adalah runtime-nya tidak dipasang di komputer, melainkan dibungkus bersama aplikasinya.

Tiga aplikasi yang sama di tiga mesin, dan di dalam container pada satu mesin
Satu mesin disiapkan per aplikasi
Yang kamu siapkan
  • Tiga komputer
  • Tiga OS
  • Node.js 18 / Python 3.11 / Node.js 20 dipasang di mesin terpisah
Satu mesin dibagi lewat container
Satu komputer, satu OS — tiga container berjalan di atasnya
Container 1
  • Satu proses
  • Node.js 18
  • server.js
Container 2
  • Satu proses
  • Python 3.11
  • batch.py
Container 3
  • Satu proses
  • Node.js 20
  • admin.js
Yang atas menyiapkan satu mesin per aplikasi, jadi perlu tiga mesin dan tiga OS. Yang bawah menjalankan tiga container, masing-masing sebagai satu proses, di atas satu OS, jadi satu mesin dan satu OS sudah cukup.

OS-nya satu, dan setiap container berjalan di atasnya sebagai satu proses.

Runtime-nya berada terpisah di dalam masing-masing container, jadi apa pun yang dipakai container di sebelahnya tidak berpengaruh.

Bagian perangkat keras yang dipakai untuk menjalankan sesuatu, seperti CPU dan memori, disebut resource.

Yang atas menjalankan tiga OS, sedangkan yang bawah berbagi satu OS, jadi perangkat keras yang sama bisa memuat lebih banyak aplikasi.

Kamu bisa menjalankan lebih banyak di jumlah mesin yang sama, dan biaya untuk terus menjalankannya pun lebih kecil.

Tidak ada OS baru yang dinyalakan, jadi waktu sampai ia mulai berjalan juga lebih singkat.

Menjalankan dua di mesin yang sama: tempat runtime diletakkan mengubah hasilnya
Ingin Node 18 danNode 20 jalan disatu mesinPasang runtimeke dalam OSSatu mesin hanyamuat satu nodeHarus memilihsalah satunyaBungkus runtimedalam containerTiap containerpunya node sendiriKeduanya jalanberdampingan
Bagian kiri adalah yang ingin kamu jalankan. Jalur atas memasang runtime di komputer; jalur bawah membungkusnya ke dalam container. Di mesin yang sama pun, tempat kamu menaruh runtime mengubah hasilnya.

Satu OS hanya bisa memuat satu node, tetapi dengan container kamu bisa menjalankan keduanya berdampingan dengan node yang terpisah.

Runtime-nya terpisah untuk setiap aplikasi, jadi menaikkan versi salah satunya tidak mengganggu yang lain, yang tetap berjalan.

Kumpulan file yang sudah dibungkus itu disebut container image (aplikasi, runtime, dan file yang dibutuhkannya yang dibungkus menjadi satu), dan Docker adalah software paling dikenal untuk membuat lalu menjalankannya.

Pihak yang memakainya cukup menerima image ini lalu menjalankannya.

Satu image yang sama memberi susunan yang sama di mana pun kamu menjalankannya
Aplikasi, runtime,file yang perluContainer imagedalam satu paketKomputer kamuServer publikKomputer rekan
Container image adalah ketiga hal di kiri yang dibungkus menjadi satu. Ketiga tempat di kanan menjalankan image itu apa adanya, jadi kamu tidak perlu memasang runtime-nya lagi.

Walaupun tempat menjalankannya berubah, yang dijalankan adalah satu image yang sama.

Kamu tidak perlu memasang runtime lagi di server publik, jadi kamu bisa merilis susunan yang sama dengan yang berjalan di mesin kamu sendiri.

Garis pemisah ketika kamu memilih adalah apakah ia harus tetap berjalan ketika tidak ada request.

Garis pemisah lainnya adalah seberapa banyak yang bisa kamu muat di satu mesin.

Perlu tidaknya selalu aktif memilah ketiga cara menjalankannya
Program yang dijalankanHarus jalan walautanpa requestRuntime dipasangdi komputerServerselalu aktifRuntime dibungkusjadi satuContainerCukup menjawabrequest sajaJalan hanya saatdipanggilServerless
Dari satu simpul di kiri, pemilahannya adalah apakah ia harus berjalan ketika tidak ada request. Dua garis atas terus berjalan setelah dinyalakan, dan satu garis bawah baru mulai berjalan setelah request datang.

Pada dua garis atas, prosesnya tetap berjalan walaupun tidak ada request.

Keduanya dibedakan oleh apakah runtime-nya dipasang di komputer atau dibungkus bersama aplikasinya.

Dua bentuk yang selalu aktif tetap berjalan termasuk selama waktu ketika tidak ada request yang datang.

Pada serverless, yang dihitung hanyalah lama ia berjalan dan berapa kali ia dipanggil.

Selama request masih jarang, perbedaan itu langsung terasa.

Pilih berdasarkan berapa lama ia tetap berjalan

Pemilahan pertamanya adalah apakah ia harus tetap berjalan ketika tidak ada request.

Kalau tidak perlu, pilih serverless; kalau perlu, pilih server yang selalu aktif atau container.

Container berbagi satu OS antar aplikasi, jadi kamu bisa memuat banyak di perangkat keras yang sama dan menekan biaya untuk terus menjalankannya.

Kamu juga memilih container ketika kamu ingin susunan di mesin kamu sendiri sama dengan susunan di server publik.

QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Pada server yang selalu aktif dan pada serverless, apa bedanya lama program pemrosesannya berjalan?

Soal 2Kapan kamu memakai container?

Soal 3Apa yang kamu lakukan ketika nilai yang kamu taruh di memori di tengah pemrosesan ingin kamu pakai juga pada request berikutnya?