Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer

PHP ve NATS ile
 Mikroservis Mesajlaşma Sistemi

3 min read

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 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 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.

Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer

Dünyada E-Ticaret Sektörü ve İşletmeler İçin Satış Fırsatları

Tüketici davranışları günden güne değişmekte ve alış veriş yapma alışkanlıkları buna bağlı olarak farklılaşmaktadır. Özellikle günümüz internet ve teknoloji çağında online ticaret büyük bir...
Erhan Yakut
3 min read