NATS ile mikroservis iletişim kanalının nasıl oluşturulabileceğini ve bu kanala PHP ile nasıl bağlanılarak mesaj alınıp, gönderilebileceğiniz anlatıldığı sunum.
1. 1
PHP ve NATS ile
Mikroservis Mesajlaşma Sistemi
Erhan Yakut / @yakuter
Netsparker İstanbul PHPKonf / 4 Mayıs 2019
2. 2
Sunum Hakkında
Neler konuşacağız?
• Biyografi
• İletişim Kavramı
• Mikroservis Mimarisi ve İletişim Kanalı
• NATS’ın Genel Özellikleri
• Demo
• Kapanış
3. 3
Programlama Dilleri
Aktif olarak Go ile geliştirme yapmakla
birlikte uzun yıllar PHP backend
developer olarak proje geliştirdim.
İletişim Bilgisi
Eposta : erhan.yakut@icsdefense.net
Twitter: @yakuter
Web : https://www.yakuter.com
İş / Görev
Ankara’da bulunan ve EKS güvenliği
konusunda ürün geliştiren ICS Defense
firmasında yazılım takım lideriyim.
Tecrübe/Bilgi
Yaklaşık 10+ yıldır yazılım geliştirme ile
ilgilenmekte olup, şu anda network ve
paket analizi ile anomali tespiti üzerine
çalışmaktayım.
Erhan YAKUT (yakuter)
Biyografi
Ben Kimim?
8. 8
NATS Nedir?
NATS’a giriş
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, 2012’den itibaren Go ile yazılmıştır.
Production’da 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)…
Önemli bağlantılar:
NATS resmi web sitesi https://nats.io
Github Organizasyon sayfası: https//github.com/nats-io
Anahtar Kelimeler
NATS
Cloud Native
CNCF
Derek Collison
CloudFoundry
Ruby
Go
Microservice
Messaging
Event Bus
Message Broker
Synadia
9. 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.
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.
Anahtar Kelimeler
NATS Server
NATS Streaming
NATS Client
9
10. NATS Server Çeşitleri
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
Anahtar Kelimeler
NATS Server
NATS Streaming
10
11. 11
NATS İstemci (Client) Kütüphaneleri
Anahtar Kelimeler
NATS Server
NATS Streaming
NATS Client
NATS Server
NATS Tarafından Desteklenen
C/C#/Elixir/Go/Java/NGINX/Node.js/Pure Ruby/Python Asyncio/Python Tornado/Ruby/TypeScript
Topluluk Tarafından Desteklenen
.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 Tarafından Desteklenen
C/C#/Go/Java/Node.js/Python Asyncio/Ruby
Topluluk Tarafından Desteklenen
Arduino/Asyncio/PHP/Perl
12. 12
NATS Özellikleri
Anahtar Kelimeler
NATS Benchmark
Brokered Throughput
Brokerless Throughput
ActiveMQ
Kafka
Kestrel
ruby-nats
NSQ
RabbitMQ
Redis
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!
14. 14
NATS Özellikleri
Anahtar Kelimeler
Pub/Sub
Publisher/Subscriber
Request/Reply
Queueing
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.
Publisher/Subscriber
Request/Reply
Queueing
15. 15
NATS Özellikleri
Anahtar Kelimeler
Pub/Sub
Publisher/Subscriber
Subject
Pub/Sub Mantığı
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.
KONUPublisher
Mesaj
Subscriber
Subscriber
Subscriber
Mesaj
16. 16
NATS Özellikleri
Anahtar Kelimeler
Plain text protocol
Message broker
Event bus
CONNECT, PUB, SUB, UNSUB
INFO, MSG, -ERR, +OK
PING, PONG
NATS Basittir!
NATS, toplamda 10 basit komutu olan metin (text) tabanlı bir iletişim kanalıdır.
Client -> Server : CONNECT | PUB | SUB | UNSUB
Client <- Server : INFO | MSG | -ERR | +OK
Client <->Server : 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.
17. 17
NATS Özellikleri
Anahtar Kelimeler
Provide dial tone
Auto-pruning
Fire and forget
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.
18. 18
NATS Özellikleri
Anahtar Kelimeler
Clustered
High availability
NATS Kümelendirilebilir!
- NATS, kümelenmiş (clustered) şekilde yüksek kullanılabilir (high availability)
yapıda çalışabilir.
NAT
S
İSTEMCİ
(Client)
İSTEMCİ
(Client)
İSTEMCİ
(Client)
İSTEMCİ
(Client)
NAT
S
NAT
S
19. 19
NATS Özellikleri
Anahtar Kelimeler
Clustered
High availability
NATS Kümelendirilebilir!
- NATS, kümelenmiş (clustered) şekilde yüksek kullanılabilir (high availability)
yapıda çalışabilir.
NAT
S
İSTEMCİ
(Client)
İSTEMCİ
(Client)
İSTEMCİ
(Client)
İSTEMCİ
(Client)
NAT
S
NAT
S
20. 20
NATS Özellikleri
Anahtar Kelimeler
Clustered
High availability
Ç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
21. 21
NATS Özellikleri
Anahtar Kelimeler
NATS Monitoring
nats-top
natsboard
nats-mon
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
22. 22
NATS ve PHP
Anahtar Kelimeler
NATS PHP ClientNATS 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.