Menjelajahi scaler message queue dari cloud dan self-hosted: AWS SQS dengan IRSA, Azure Service Bus, GCP Pub/Sub, RabbitMQ, Kafka consumer lag, Redis Streams, dan NATS JetStream. Lengkap dengan konfigurasi dan best practice autoscaling.

Di episode 7 kita bermain dengan scaler dasar yang mengandalkan metrik. Sekarang kita masuk ke wilayah paling sering memakai KEDA di dunia nyata: message queue dan stream. Queue adalah representasi paling jujur dari beban kerja — setiap item adalah pekerjaan yang belum dikerjakan, dan jumlahnya naik sebelum CPU sempat bekerja. Itulah sinyal scale-up paling proaktif, dan dasar dari semua pola di episode ini.
Untuk mengakses SQS tanpa access key di dalam pod, KEDA memakai IAM Roles for Service Accounts (IRSA): TriggerAuthentication menunjuk provider: aws, dan annotation role-arn dipasang di ServiceAccount operator KEDA. Azure memakai azure-workload, GCP memakai gcp — polanya identik.
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: keda-trigger-auth-aws-credentials
namespace: production
spec:
podIdentity:
provider: awsapiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: order-worker-scaler
namespace: production
spec:
scaleTargetRef:
name: order-worker
minReplicaCount: 0
maxReplicaCount: 30
triggers:
- type: aws-sqs-queue
authenticationRef:
name: keda-trigger-auth-aws-credentials
metadata:
awsRegion: ap-southeast-3
queueURL: https://sqs.ap-southeast-3.amazonaws.com/123456789012/orders
queueLength: "10"
activationQueueLength: "5"queueLength: "10" berarti tiap 10 pesan menghasilkan 1 pod; activationQueueLength: "5" mencegah scale-up prematur. Untuk scaler berikutnya hanya fragment triggers yang ditampilkan — wrapper ScaledObject-nya identik dengan contoh di atas. Cek bahwa semuanya terdaftar lewat kubectl get scaledobject -n production.
Service Bus diskalakan lewat Azure AD Workload Identity — tanpa connection string. Targetnya messageCount per replika.
- type: azure-servicebus
authenticationRef:
name: azure-workload-identity
metadata:
namespace: notifikasi
queueName: email-outbound
messageCount: "50"
activationMessageCount: "5"Di GCP, trigger dipicu oleh jumlah pesan yang belum diakui (undelivered) di subscription.
- type: gcp-pubsub
authenticationRef:
name: gcp-workload-identity
metadata:
subscriptionName: video-render-sub
subscriptionSize: "5"
activationSubscriptionSize: "1"Tip
Best practice di ketiga cloud provider sama: hindari hardcode credential di ScaledObject, pakai podIdentity agar rotasi key ditangani otomatis cloud, dan atur parameter activation agar batch kecil tidak memicu scaling sia-sia.
RabbitMQ diskalakan berdasarkan queueLength — target pesan per replika. Host diambil dari secret lewat secretTargetRef, pola yang sama dipakai Redis Streams.
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: rabbitmq-auth
spec:
secretTargetRef:
- parameter: host
name: rabbitmq-secret
key: host - type: rabbitmq
authenticationRef:
name: rabbitmq-auth
metadata:
protocol: amqp
queueName: jobs
queueLength: "5"
activationQueueLength: "1"Di Kafka, KEDA mengukur consumer lag: selisih antara offset terakhir di topic dengan offset yang sudah diproses grup konsumen. Lag tinggi berarti banyak pesan menunggu — sinyal scale-up yang sempurna.
- type: kafka
metadata:
topic: order-events
bootstrapServers: kafka-broker.kafka.svc:9092
consumerGroup: order-processor
lagThreshold: "100"
activationLagThreshold: "10"Note
Satu ScaledObject Kafka mengatur satu consumerGroup. Jika satu grup mengonsumsi banyak topic, sebutkan semuanya di topic dengan pemisah koma agar lag dihitung agregat.
Redis Streams diskalakan berdasarkan panjang pending entries pada consumer group tertentu — hanya menghitung pesan yang belum diakui, lebih akurat daripada panjang stream.
- type: redis-streams
authenticationRef:
name: redis-auth
metadata:
stream: jobs
consumerGroup: workers
pendingEntriesCount: "5"
lag: "5"NATS JetStream diskalakan berdasarkan lagThreshold — pesan yang belum diproses pada subject dalam sebuah stream.
- type: nats-jetstream
metadata:
natsServerMonitoringEndpoint: nats.monitoring.svc:8222
subject: jobs.>
stream: ORDERS
lagThreshold: "20"Warning
Broker self-hosted adalah titik kegagalan tunggal autoscaling. Selalu pasang fallback di ScaledObject dan pantau keda_scaler_errors_total. Kalau broker mati, KEDA jangan sampai men-scaledown konsumen yang justru dibutuhkan untuk menguras pesan.
Queue bukan satu-satunya sumber sinyal. Di episode 9 kita membahas database scalers (PostgreSQL, MySQL, Redis list, MongoDB) dan pengenalan KEDA HTTP Add-on dengan HTTPScaledObject untuk scale-to-zero workload HTTP. Sampai jumpa!