Emir Karşıyakalı liderliğinde 6 yıldır düzenlenmekte olan PHPKonf, bu yıl 4 Mayıs 2019 tarihinde Star Wars temasıyla Haliç manzaralı Kadir Has Üniversitesi’nde icra edildi. Bu harika etkinlikte hepsi birbirinden kaliteli ve özgün çok başarılı sunumlar yapıldı. Konuşmacı olarak katıldığım PHPKonf 2019’da ben de PHP ve NATS ile
Mikroservis Mesajlaşma Sistemini anlattım. Bu yazıda kısaca NATS hakkında bilgi sahibi olup, yazının sonunda yapmış olduğum sunuma ulaşabilirsiniz.
NATS Nedir?
NATS, bulut uyumlu (cloud native) uygulamalar için geliştirilmiş açık kaynak, basit, güvenli ve yüksek performanslı mesajlaşma sistemidir.
NATS hakkında bilgiler:
- Derek Collison tarafından CloudFoundry (Google, Microsoft, Cisco…) için 2010 yılında geliştirilmiştir.
- Önceleri Ruby ile yazılmış olan uygulama 2012’de Go ile baştan yazılmıştır.
- Production ortamında yaklaşık 8 yıldır kullanılmaktadır.
- 15 Mart 2018’de Cloud Native Computing Foundation (CNCF) (Kubernetes, Prometheus, Envoy, gRPC… ) tarafından kuluçka proje olarak kabul edilmiştir. Halen Synadia isimli açık kaynak ekosistemi tarafından geliştirilmektedir.
- Apcera, Baidu, Siemens, VMware, HTC, Samsung, General Electric (GE) gibi dünya devleri tarafından kullanılmaktadır.
Önemli bağlantılar:
NATS resmi web sitesi https://nats.io
Github Organizasyon sayfası: https//github.com/nats-io
NATS Bileşenleri
NATS temel olarak iki bileşenden oluşmaktadır, Server ve Client.
NATS Server: Go programlama dili ile yazılmış bir sunucu olup, fiziksel sunucuya yük bindirmeyen (lightweight) yapısı ile iletişim kanalının temelini oluşturur.
2 çeşit NATS Server vardır.
- NATS Server/gnatsd https://github.com/nats-io/gnatsd
- NATS Streaming/nats-streaming-server https://github.com/nats-io/nats-streaming-server
NATS Client: NATS Server’a bağlanarak veri gönder ve alma işlemini yapan birimlerdir. NATS’ın hemen hemen bütün programlama dilleri için yazılmış istemci (client) kütüphaneleri bulunmaktadır. Go, Node, Ruby, Java, C, C# ve NGINX C kütüphaneleri bizzat NATS takımı tarafından geliştirilmektedir.
NATS İstemci (Client) Kütüphaneleri
NATS Server
NATS Ekibi Tarafından Geliştirilen
C/C#/Elixir/Go/Java/NGINX/Node.js/Pure Ruby/Python Asyncio/Python Tornado/Ruby/TypeScript
Topluluk Tarafından Geliştirilen
.NET/Arduino/Clojure/Elixir/Elm/Erlang/Haskell/Java Android/Lua/MicroPython/PHP/Perl/Python/Python Twisted/Qt5 C++/Rust/Scala/Spring API/Swift
NATS Streaming
NATS Ekibi Tarafından Geliştirilen
C/C#/Go/Java/Node.js/Python Asyncio/Ruby
Topluluk Tarafından Geliştirilen
Arduino/Asyncio/PHP/Perl
NATS Özellikleri
NATS Hızlıdır!
NATS gerçekten hızlıdır ve bu diğer rakiplerine istinaden basit bir hız farkı değildir!
NATS Pub/Sub Çalışır
NATS hakkında ilk bilinmesi gereken şey Publisher/Subscriber metoduna göre çalıştığıdır. Bu yöntemde kanala bir mesaja gönderen, bir de bu kanala abone olup mesaj bekleyen istemciler bulunur. Ayrıca Request/Reply ve Queueing destekler.
Pub/Sub gönderim metodunda ortak nokta olarak bir konu (subject) oluşturulur. Aboneler (sub) bu konuya abone olurlar. Yayıncılar (pub) aynı konuya mesaj gönderdiği anda konuya abone olan tüm istemcilere mesaj iletilir.
NATS Basittir!
NATS, toplamda 10 basit komutu olan metin (text) tabanlı bir iletişim kanalıdır.
CONNECT | PUB | SUB | UNSUB | INFO | MSG | -ERR | +OK | PING | PONG
➜ ~ telnet 0.0.0.0 4222 Trying 0.0.0.0... Connected to 0.0.0.0. INFO {"server_id":"gBUO4mdK197nIvQAV92Ndc","version":"1.4.1", "proto":1,"go":"go1.12.4","host":"0.0.0.0","port":4222, “max_payload":1048576,"client_id":11} PING PONG sub konu 10 +OK MSG konu 10 5 hello
➜ ~ telnet 0.0.0.0 4222 Trying 0.0.0.0... Connected to 0.0.0.0. INFO {"server_id":"gBUO4mdK197nIvQAV92Ndc","version":"1.4.1", "proto":1,"go":"go1.12.4","host":"0.0.0.0","port":4222, “max_payload":1048576,"client_id":12} pub konu 5 hello +OK -ERR 'Stale Connection' Connection closed by foreign host.
NATS Esnek ve Dayanıklıdır!
- NATS, her zaman mesaj iletmeye müsaittir (çevir sesi – dial tone sağlar)
- Yavaş mesaj tüketenleri sistemden çıkarma (disconnect) yeteneği vardır. (Auto-pruning)
- Mesajın bozulmadan karşı tarafa iletilmesini garanti eder.
- Fire and forget (unut gitsin :) ) mesaj gönderimi yapar.
NATS Kümelendirilebilir!
NATS, kümelenmiş (clustered) şekilde yüksek kullanılabilir (high availability) yapıda çalışabilir.
Çoklu Servis Kalitesi (Multi QoS)
QoS, ağdaki paket kaybı (packet loss), gecikme (latency) ve bozulma/kayma (jitter) gibi kusurları azaltmak için kullanılan teknolojileri ifade eder.
NATS üzerinde servis kalitesini artırmak için iki ulaştırma (delivery) şekli desteklenir.
At-most-once delivery: NATS Server’ın uyguladığı bu yöntemde mesaj ulaştırılması için zorlama yoktur. Yani mesaj gönderildiğinde istemci (client) bağlı değilse mesajı alamaz.
At-least-once delivery: NATS Streaming’in uyguladığı bu yöntemde aşağıdaki şartlar sağlanana kadar mesaj sunucu muhafaza edilir ve istemcilere iletilmeye çalışılır.
– Bir abone mesajı aldığını onaylar
– Mesajın süresi (timeout) dolar
– Bellek (storage) yorulur
Kanal İzleme (Monitoring)
(gnatsd -m 8222)
NATS Server, kanaldaki bağlantıların, gönderilen ve alınan mesaj durumu vb. konuların takip edilebilmesi için izleme (monitoring) desteği sunmaktadır. En meşhur izleme araçları:
- nats-top – Wally Quevedo (Synadia) – https://github.com/nats-io/nats-top
- natsboard – Fatih Cetinkaya – https://github.com/cmfatih/natsboard
- nats-mon – Raül Pérez ve Adrià Cidre – https://github.com/repejota/nats-mon
NATS ve PHP
NATS ile iletişim kanalı oluşturduğumuz mikroservislerimizde gönül rahatlığı ile PHP kullanabiliriz çünkü hazır PHP istemci kütüphaneleri sayesinde rahatlıkla mesaj alınıp gönderilebilmektedir.
Örnek Uygulama
Sunum Dosyası
PHPKonf 2019’da yaptığım sunumu buradan ulaşabilirsiniz.