Setelah server backend dihapus atau dinyatakan tidak sehat, koneksi yang ada ke server tersebut tetap terbuka selama periode tertentu. Permintaan masih dapat diteruskan ke server backend. Dalam situasi ini, kesalahan permintaan dapat dipicu atau layanan pada server backend tidak dapat diundeploy. Untuk mencegah hal ini, Anda dapat mengaktifkan pengurasan koneksi untuk instance Application Load Balancer (ALB) Anda. Ketika server backend dihapus atau dinyatakan tidak sehat, transmisi data dipertahankan hingga periode timeout pengurasan koneksi berakhir. Setelah waktu tersebut berakhir, koneksi secara proaktif ditutup, memastikan undeploy layanan yang mulus.
Skenario
Pengurasan koneksi sangat ideal untuk skenario berikut:
Menghapus server backend: Sebelum menghapus server backend, disarankan menentukan periode timeout pengurasan koneksi yang lebih lama untuk memastikan server memiliki waktu memproses permintaan yang ada.
Server backend yang tidak sehat: Disarankan menentukan periode timeout pemeriksaan kesehatan yang singkat untuk memastikan koneksi rusak ditutup sebelum kesalahan dikembalikan ke klien.
Untuk menggunakan pengurasan koneksi dalam skenario yang disebutkan di atas, Anda harus menentukan periode timeout pengurasan koneksi yang tepat berdasarkan kebutuhan bisnis Anda.
Skenario 1: Menghapus server backend
Gambar berikut menunjukkan skenario dalam contoh ini. Saat Anda menghapus ECS01, ALB tidak lagi mendistribusikan permintaan ke ECS01, yang hanya memproses permintaan yang ada dan tidak menerima permintaan baru.
Jika pengurasan koneksi dinonaktifkan, ECS01 menutup sesi setelah semua permintaan yang ada diproses.
Jika pengurasan koneksi diaktifkan dan periode timeout pengurasan koneksi ditentukan:
Jika ECS01 memiliki permintaan yang sedang berlangsung, ALB menutup sesi pada ECS01 ketika periode timeout pengurasan koneksi berakhir.
Jika ECS01 tidak memiliki permintaan yang sedang berlangsung atau koneksi aktif, ALB segera menghapus ECS01, terlepas dari apakah periode timeout pengurasan koneksi berakhir.
Jika ECS01 memiliki permintaan yang sedang ditransmisikan, koneksi ditutup ketika ECS01 dihapus dan kode kesalahan 500 dikembalikan ke klien. Misalnya, jika Anda menentukan periode timeout pengurasan koneksi menjadi 15 detik tetapi ECS01 memerlukan 30 detik untuk memproses permintaan, koneksi ditutup sebelum ECS01 mengirimkan semua respons. Akibatnya, klien menerima kode kesalahan 500.
CatatanJika ECS01 dihapus tetapi ditambahkan kembali, sesi yang ada tidak terpengaruh sebelum periode timeout pengurasan koneksi berakhir. Periode timeout pengurasan koneksi dimulai ketika ECS01 dihapus. Status ECS01 tetap tidak berubah sebelum sesi yang ada ditutup. Selama proses ini, ECS01 hanya memproses permintaan yang ada dan tidak lagi menerima permintaan baru. Sesi yang ada ditutup ketika periode timeout pengurasan koneksi berakhir.
Hapus ECS01, aktifkan pengurasan koneksi, dan tentukan periode timeout pengurasan koneksi. Gambar berikut menunjukkan perubahan status ECS01.
Skenario 2: Server backend yang tidak sehat
Jika ECS01 dinyatakan tidak sehat oleh pemeriksaan kesehatan, ALB tidak lagi mendistribusikan permintaan ke ECS01. Dalam hal ini, ECS01 dapat memproses permintaan yang ada tetapi tidak lagi menerima permintaan baru.
Jika pengurasan koneksi dinonaktifkan, ECS01 tidak menerima permintaan baru sampai ECS01 dinyatakan sehat kembali.
Jika pengurasan koneksi diaktifkan dan periode timeout pengurasan koneksi ditentukan:
ALB menutup sesi yang ada pada ECS01 ketika periode timeout pengurasan koneksi berakhir.
Jika grup server diperbarui, seperti pembaruan konfigurasi ECS01, status koneksi ECS01 tetap tidak berubah. ECS01 dapat memproses permintaan yang ada tetapi tidak menerima permintaan baru. ALB masih menutup sesi yang ada pada ECS01 ketika periode timeout pengurasan koneksi berakhir meskipun ECS01 dinyatakan sehat.
CatatanALB menutup sesi yang ada pada ECS01 ketika periode timeout pengurasan koneksi berakhir. Jika ECS01 sehat, ECS01 dapat menerima permintaan baru. Jika ECS01 tidak sehat, ECS01 tidak menerima permintaan baru.
Jika server backend dinyatakan tidak sehat selama pembaruan konfigurasi, pengurasan koneksi tidak dipicu. Pengurasan koneksi hanya dipicu ketika server backend dinyatakan tidak sehat karena kesalahan layanan.
Gambar berikut menunjukkan perubahan status ECS01 ketika dinyatakan tidak sehat.
Tentukan periode timeout pengurasan koneksi yang tepat berdasarkan kebutuhan bisnis Anda. Dalam contoh ini, Skenario 1: Menghapus server backend digunakan untuk menunjukkan cara mengaktifkan pengurasan koneksi untuk sesi WebSocket dan HTTP.
Peringatan
ALB ALB Hanya ALB standar dan ALB dengan WAF yang mendukung pengurasan koneksi. ALB dasar tidak mendukung pengurasan koneksi.
Grup server tipe Function Compute tidak mendukung pengurasan koneksi.
Untuk mengaktifkan pengurasan koneksi, disarankan menggunakan protokol WebSocket. Dalam skenario HTTP, permintaan HTTP mungkin habis waktu atau dibatasi. Untuk mencegah masalah tersebut, disarankan menetapkan periode timeout pengurasan koneksi ke nilai yang lebih besar dari periode timeout permintaan koneksi ALB. Periode timeout pengurasan koneksi default lebih panjang dari periode timeout permintaan koneksi untuk mencegah permintaan HTTP ditutup secara keliru. Untuk informasi lebih lanjut tentang cara mengonfigurasi periode timeout permintaan koneksi, lihat Tambahkan Pendengar HTTP.
Prasyarat
Instance ALB standar atau ALB dengan WAF dibuat, dan grup server tipe server dibuat untuk instance ALB. Dalam contoh ini, instance ALB standar digunakan. Untuk informasi lebih lanjut, lihat Buat dan Kelola Instance ALB dan Buat dan Kelola Grup Server.
Pendengar HTTP yang menggunakan port
80dibuat untuk instance ALB, dan pendengar tersebut terkait dengan grup server. Untuk informasi lebih lanjut, lihat Tambahkan Pendengar HTTP.ECS01 dan ECS02 dibuat. Untuk informasi tentang cara membuat instance, lihat Buat Instance Menggunakan Wizard.
ECS02 ditambahkan ke grup server, dan layanan pada ECS02 dapat diakses dari klien. Untuk informasi lebih lanjut, lihat Gunakan Instance ALB untuk Menyediakan Layanan IPv4 dan Gunakan ALB untuk Menyeimbangkan Beban Layanan IPv6.
CatatanDalam contoh ini, klien yang menjalankan sistem operasi 64-bit Alibaba Cloud Linux 3.2104 digunakan. Pastikan Python diinstal pada sistem operasi klien Anda dan pada ECS01. Untuk informasi lebih lanjut tentang cara menginstal Python, lihat Unduh Python. Dalam contoh ini, Python3.x digunakan.
Dalam contoh ini, layanan berjalan pada ECS02. Jika Anda memiliki server backend yang dapat menjalankan layanan, Anda tidak perlu membuat ECS02.
Konfigurasikan tugas sinkronisasi data
Prosedur ini menunjukkan cara menggunakan pengurasan koneksi untuk menguras sesi WebSocket dan HTTP serta bagaimana permintaan diproses oleh ALB dalam berbagai status pengurasan koneksi.
Pengurasan koneksi untuk sesi WebSocket
Langkah 1: Aktifkan pengurasan koneksi
Dalam contoh ini, grup server sudah disiapkan. Pengurasan koneksi dikonfigurasi dengan memodifikasi grup server. Jika Anda tidak memiliki grup server, Anda dapat mengaktifkan pengurasan koneksi saat membuat grup server.
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat grup server diterapkan.
Di panel navigasi sisi kiri, pilih .
Di halaman Server Groups, klik ID grup server yang ingin dikelola.
Di tab Details, klik Modify Basic Information di bagian Basic Information.
Di kotak dialog Modify Basic Information, klik Advanced Settings dan nyalakan Connection Draining.
Atur Connection Draining Timeout ke 300 detik dan klik Save.
Langkah 2: Verifikasi hasilnya
Konfigurasikan pengurasan koneksi pada server backend
Masuk secara jarak jauh ke ECS01. Untuk informasi lebih lanjut, lihat Metode untuk Menghubungkan ke Instance ECS.
Jalankan perintah berikut untuk membuat file WebSocket dan membuka direktori WebSocket:
mkdir WebSocket cd WebSocketJalankan perintah berikut untuk menginstal paket dependensi:
pip install tornado pip install websocket-clientJalankan perintah berikut untuk memodifikasi file konfigurasi server.py:
vim server.pyTekan tombol
Iuntuk membuka editor dan konfigurasikan parameter berikut untuk mengaktifkan layanan WebSocket:#!/usr/bin/env python3 # encoding=utf-8 import tornado.websocket import tornado.ioloop import tornado.web from datetime import datetime # Penanganan WebSocket class WebSocketHandler(tornado.websocket.WebSocketHandler): def open(self): current_time = datetime.now() formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S") print("Waktu:", formatted_time, "Koneksi WebSocket telah dibuat") def on_message(self, message): current_time = datetime.now() formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S") print("Waktu:", formatted_time, "Menerima pesan:", message) self.write_message("Server menerima pesan Anda:" + message) def on_close(self): current_time = datetime.now() formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S") print("Waktu:", formatted_time, "Koneksi WebSocket ditutup") # Rute application = tornado.web.Application([ (r"/websocket", WebSocketHandler), ]) if __name__ == "__main__": print("WebSocket Server Start on 8080 ...") application.listen(8080) tornado.ioloop.IOLoop.current().start()Setelah Anda menyelesaikan modifikasi, tekan tombol
Esc, masukkan:wq, dan kemudian tekan tombol Enter untuk menyimpan dan menutup file konfigurasi.
Di direktori file server.py, jalankan perintah berikut untuk mengaktifkan layanan WebSocket:
python3 server.pyPesan respons berikut menunjukkan bahwa layanan WebSocket telah diaktifkan:
Websocket Server Start on 8080 ...
Tambahkan ECS01 ke grup server
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat grup server diterapkan.
Di panel navigasi sisi kiri, pilih .
Di halaman Server Groups, temukan grup server yang ingin Anda kelola dan klik Modify Backend Server di kolom Actions.
Di tab Backend Servers, klik Add Backend Server, pilih ECS01 di langkah Select Servers, dan kemudian klik Next.
Di langkah Ports/Weights, pilih ECS01, atur port ke
8080, dan kemudian klik OK.
Konfigurasikan pengurasan koneksi pada klien
Masuk ke klien dan buka antarmuka baris perintah (CLI). Jalankan perintah berikut untuk membuat file WebSocket dan membuka direktori WebSocket:
mkdir WebSocket cd WebSocketJalankan perintah berikut untuk menginstal paket dependensi:
pip install websocket-clientJalankan perintah berikut untuk memodifikasi file client.py:
vim client.pyTekan tombol
Iuntuk membuka editor dan konfigurasikan parameter berikut untuk mengaktifkan layanan akses untuk klien WebSocket:#!/usr/bin/env python3 # encoding utf-8 import websocket import time from datetime import datetime def on_message(ws, message): print("Menerima pesan server:", message) if __name__ == "__main__": ws = websocket.WebSocket() ws.connect("ws://<Nama domain>:80/websocket") # Masukkan nama domain berdasarkan situasi aktual print("Koneksi WebSocket telah dibuat") try: while True: current_time = datetime.now() formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S") print("Waktu paket:", formatted_time) ws.send("Halo, Server!") result = ws.recv() on_message(ws, result) time.sleep(1) except Exception: print("Koneksi WebSocket ditutup")Setelah Anda menyelesaikan modifikasi, tekan tombol
Esc, masukkan:wq, dan kemudian tekan tombol Enter untuk menyimpan dan menutup file konfigurasi.
Di direktori file client.py, jalankan perintah berikut untuk mengakses ECS01:
python3 client.pyPesan respons berikut menunjukkan bahwa klien dapat mengakses ECS01:
Koneksi WebSocket telah dibuat Waktu paket: 2024-04-28 17:00:53 Menerima pesan server: Server menerima pesan Anda: Halo, Server! Waktu paket: 2024-04-28 17:00:54 Menerima pesan server: Server menerima pesan Anda: Halo, Server!ECS01 mengembalikan pesan respons berikut:
WebSocket Server Start on 8080 ... Waktu: 2024-04-28 17:00:53 Koneksi WebSocket telah dibuat Waktu: 2024-04-28 17:00:53 Menerima pesan: Halo, Server! Waktu: 2024-04-28 17:00:54 Menerima pesan: Halo, Server!
Hapus server backend
Tentukan periode timeout pengurasan koneksi sebelum Anda menghapus server backend.
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat grup server diterapkan.
Di panel navigasi sisi kiri, pilih .
Klik ID grup server dari mana Anda ingin menghapus server backend.
Di tab Backend Servers, temukan ECS01 dan klik Remove di kolom Actions.
Di pesan Remove Backend Server, klik OK.
Tunggu hingga periode timeout pengurasan koneksi berakhir
Dalam contoh ini, periode timeout pengurasan koneksi diatur menjadi 300 detik. Akibatnya, koneksi pada ECS01 ditutup 300 detik setelah Anda menghapus ECS01.
Dalam hasil tes, waktu dari saat koneksi WebSocket dibuat pada ECS01 hingga saat koneksi WebSocket ditutup pada ECS01 adalah 330 detik. Periode timeout pengurasan koneksi merujuk pada waktu dari saat ECS01 dihapus hingga koneksi WebSocket ditutup, yaitu sekitar 300 detik.
Klien mengembalikan pesan respons berikut:
Waktu paket: 2024-04-28 17:06:23 Menerima pesan server: Server menerima pesan Anda: Halo, Server! Waktu paket: 2024-04-28 17:06:24 Koneksi WebSocket ditutupECS01 mengembalikan pesan respons berikut:
Waktu: 2024-04-28 17:06:22 Menerima pesan: Halo, Server! Waktu: 2024-04-28 17:06:23 Menerima pesan: Halo, Server! Waktu: 2024-04-28 17:06:23 Koneksi WebSocket ditutup
Pengurasan koneksi untuk sesi HTTP
Dalam skenario HTTPS, respons yang diterima klien bervariasi berdasarkan periode timeout pengurasan koneksi, periode timeout permintaan koneksi, dan waktu pemrosesan server backend.
Jika periode timeout pengurasan koneksi lebih pendek dari waktu pemrosesan server backend, respons dari ECS01 terputus. Akibatnya, klien menerima kode status HTTP 500.
Jika waktu pemrosesan server backend lebih lama dari periode timeout permintaan koneksi, respons dari ECS01 habis waktu. Akibatnya, klien menerima kode status HTTP 504.
Dalam contoh ini, periode timeout pengurasan koneksi diatur menjadi 15 detik dan waktu pemrosesan server backend diatur menjadi 30 detik. Dalam contoh ini, respons dari ECS01 terputus dan klien menerima kode status HTTP 500.
Di Langkah 2, periode timeout permintaan koneksi diatur ke nilai default 60 detik, yang lebih lama dari waktu pemrosesan server backend (30 detik). Akibatnya, kode status HTTP 504 tidak dikembalikan tetapi kode status HTTP 500 dikembalikan karena periode timeout pengurasan koneksi (15 detik) lebih pendek dari waktu pemrosesan server backend (30 detik).
Dalam contoh ini, fungsi
time.sleepdigunakan dalam kode Python untuk mensimulasikan waktu pemrosesan server backend.
Langkah 1: Aktifkan pengurasan koneksi
Dalam contoh ini, grup server sudah disiapkan. Pengurasan koneksi dikonfigurasi dengan memodifikasi grup server. Jika Anda tidak memiliki grup server, Anda dapat mengaktifkan pengurasan koneksi saat membuat grup server.
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat grup server diterapkan.
Di panel navigasi sisi kiri, pilih .
Di halaman Server Groups, klik ID grup server yang ingin Anda kelola.
Pada tab Details, klik Modify Basic Information di bagian Basic Information.
Di kotak dialog Modify Basic Information, klik Advanced Settings dan nyalakan Connection Draining.
Atur Timeout Period ke 15 detik dan klik Save.
Langkah 2: Tentukan periode timeout permintaan koneksi
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat instance ALB diterapkan.
Di halaman Instances, klik ID instance ALB yang ingin dikelola.
Di tab Listener, klik ID pendengar HTTP yang ingin Anda kelola.
Di bagian Basic Information, klik Modify Listener.
Di kotak dialog Modify Listener, klik Modify di sisi kanan Advanced Settings.
Atur Connection Request Timeout ke 60 detik, yang merupakan periode timeout default, dan klik Save.
Langkah 3: Buat catatan DNS
Dalam skenario bisnis aktual, disarankan menggunakan catatan CNAME untuk memetakan nama domain kustom ke nama domain instance ALB Anda.
Di panel navigasi sisi kiri, pilih .
Di halaman Instances, salin nama domain instance ALB.
Lakukan langkah-langkah berikut untuk membuat catatan CNAME:
CatatanJika nama domain Anda tidak didaftarkan menggunakan Alibaba Cloud Domains, Anda harus menambahkan nama domain Anda ke Alibaba Cloud DNS sebelum dapat mengonfigurasi catatan DNS. Untuk informasi lebih lanjut, lihat Kelola Nama Domain.
Masuk ke Konsol Alibaba Cloud DNS.
Di halaman Authoritative DNS Resolution, temukan nama domain Anda dan klik DNS Settings di kolom Actions.
Di tab DNS Settings halaman detail nama domain, klik Add DNS Record.
Di panel Add DNS Record, konfigurasikan parameter dan klik OK. Tabel berikut menjelaskan parameter.
Parameter
Deskripsi
Record Type
Pilih CNAME dari daftar drop-down.
Hostname
Masukkan awalan nama domain. Dalam contoh ini, @ dimasukkan.
CatatanJika Anda menggunakan nama domain root, masukkan
@.DNS Request Source
Pilih Default.
Record Value
Masukkan CNAME, yaitu nama domain instance ALB.
TTL Period
Pilih nilai time-to-live (TTL) untuk catatan CNAME agar disimpan di server DNS. Dalam contoh ini, nilai default digunakan.
Langkah 4: Verifikasi hasilnya
Konfigurasikan pengurasan koneksi pada server backend
Masuk secara jarak jauh ke ECS01. Untuk informasi lebih lanjut, lihat Metode untuk Menghubungkan ke Instance ECS.
Jalankan perintah berikut untuk membuat folder HTTP dan membuka direktori HTTP:
mkdir http cd httpJalankan perintah berikut untuk memodifikasi file konfigurasi http_server.py:
vim http_server.pyTekan tombol
Iuntuk membuka editor dan konfigurasikan parameter berikut untuk mengaktifkan layanan HTTP Server:#!/usr/bin/env python3 # encoding utf-8 from http.server import SimpleHTTPRequestHandler, HTTPServer from datetime import datetime import time class DelayedHTTPRequestHandler(SimpleHTTPRequestHandler): def do_GET(self): current_time = datetime.now() formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S") print("Waktu:", formatted_time, "Menerima permintaan GET dan akan merespons dalam 30 detik....") time.sleep(30) # Konfigurasikan fungsi time.sleep untuk mensimulasikan waktu pemrosesan server backend SimpleHTTPRequestHandler.do_GET(self) PORT = 8080 server = HTTPServer(("", PORT), DelayedHTTPRequestHandler) print(f"Melayani HTTP pada port {PORT} 0.0.0.0 (http://0.0.0.0:{PORT}/) ...") server.serve_forever()Setelah Anda menyelesaikan modifikasi, tekan tombol
Esc, masukkan:wq, dan kemudian tekan tombol Enter untuk menyimpan dan menutup file konfigurasi.
Masuk ke direktori http_server.py dan jalankan perintah berikut untuk memulai layanan HTTP Server:
python3 http_server.pyPesan respons berikut menunjukkan bahwa layanan HTTP Server sedang berjalan:
Melayani HTTP pada port 8080 0.0.0.0 (http://0.0.0.0:8080/) ...
Tambahkan ECS01 ke grup server
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat grup server diterapkan.
Di halaman Server Groups, temukan grup server yang ingin Anda kelola dan klik Modify Backend Server di kolom Actions.
Di tab Backend Servers, klik Add Backend Server, pilih ECS01 di langkah Select Servers, dan kemudian klik Next.
Di langkah Ports/Weights, pilih ECS01, atur port ke
8080, dan kemudian klik OK.
Konfigurasikan pengurasan koneksi pada klien
Masuk ke klien dan buka antarmuka baris perintah (CLI). Jalankan perintah berikut untuk mengakses ECS01:
curl http://<Nama domain>:80/ -vPesan respons berikut menunjukkan bahwa instance ALB dapat mengakses layanan backend:
* Tentang untuk terhubung() ke www.example.com port 80 (#0) * Mencoba 10.X.X.225... * Terhubung ke www.example.com (10.X.X.225) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.29.0 > Host: www.example.com > Accept: */*Server menerima pesan respons berikut:
Melayani HTTP pada port 8080 0.0.0.0 (http://0.0.0.0:8080/) ... Waktu: 2024-02-07 13:57:33 Menerima permintaan Get dan akan merespons dalam 30 detik....
Hapus server backend
Tentukan periode timeout pengurasan koneksi sebelum Anda menghapus server backend.
Masuk ke Konsol ALB.
Di bilah navigasi atas, pilih wilayah tempat grup server diterapkan.
Di panel navigasi sisi kiri, pilih .
Klik ID grup server dari mana Anda ingin menghapus server backend.
Di tab Backend Servers, temukan ECS01 dan klik Remove di kolom Actions.
Di pesan Remove Backend Server, klik OK.
Tunggu hingga periode timeout pengurasan koneksi berakhir
Hasilnya menunjukkan bahwa ketika periode timeout pengurasan koneksi lebih pendek dari waktu pemrosesan server backend, klien menerima kode status HTTP 500.
* Tentang untuk terhubung() ke www.example.com port 80 (#0)
* Mencoba 10.X.X.224...
* Terhubung ke www.example.com (10.XX.XX.224) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.example.com
> Accept: */*
>
< HTTP/1.1 500 Internal Server Error
< Date: Wed, 07 Feb 2024 06:02:24 GMT
< Content-Type: text/html
< Content-Length: 186
< Connection: close
< Via: HTTP/1.1 SLB.87
<
<html>
<head><title>500 Internal Server Error</title></head>
<body bgcolor="white">
<center><h1>500 Internal Server Error</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Menutup koneksi 0Referensi
Untuk informasi lebih lanjut tentang cara mengaktifkan pengurasan koneksi saat Anda membuat grup server, lihat Buat dan Kelola Grup Server.
Untuk menerapkan penyebaran layanan yang mulus, aktifkan mode mulai lambat. Untuk informasi lebih lanjut, lihat Gunakan Mulai Lambat untuk Menerapkan Penyebaran Layanan yang Mulus.
Untuk informasi lebih lanjut tentang WebSocket dan HTTP, lihat Tambahkan Pendengar HTTP dan Gunakan WebSocket untuk Mengaktifkan Pesan Real-Time.