sgcWebSockets 2022.1'den itibaren AMQP 0.9.1 protokolü desteklenmektedir. Advanced Message Queuing Protocol (AMQP), mesaj odaklı ara katman yazılımı için açık standart bir uygulama katmanı protokolüdür. AMQP'nin tanımlayıcı özellikleri mesaj odaklılık, kuyruğa alma, yönlendirme (noktadan noktaya ve yayınla-abone ol dahil), güvenilirlik ve güvenliktir.
AMQP, çok çeşitli mesajlaşma uygulamalarını ve iletişim kalıplarını verimli bir şekilde desteklemek için tasarlanmış ikili bir uygulama katmanı protokolüdür. En fazla bir kez (her mesajın bir kez veya hiç teslim edilmediği), en az bir kez (her mesajın kesinlikle teslim edileceği, ancak bunu birden çok kez yapabileceği) ve tam olarak bir kez (mesajın her zaman kesinlikle ulaşacağı ve bunu yalnızca bir kez yapacağı) gibi mesaj teslim garantileriyle akış kontrollü, mesaj odaklı iletişim ve SASL ve/veya TLS temelli kimlik doğrulama ve/veya şifreleme sağlar. Transmission Control Protocol (TCP) gibi temel bir güvenilir taşıma katmanı protokolü varsayar.
Kanallar
AMQP, çok kanallı bir protokoldür. Kanallar, ağır bir TCP/IP bağlantısını birkaç hafif bağlantıya çoğullamanın bir yolunu sağlar. Bağlantı noktası kullanımı öngörülebilir olduğundan bu, protokolü daha "güvenlik duvarı dostu" hale getirir. Ayrıca trafik şekillendirme ve diğer ağ QoS özelliklerinin kolayca kullanılabileceği anlamına gelir.
Her kanal kendi iş parçacığında çalışır, bu nedenle her yeni mesaj alındığında önce istemci kanalı tanımlar ve mesajı, iş parçacığı kanalı tarafından işlenen bir kuyruğa alır.
Kanal yaşam döngüsü şudur:
1. İstemci yeni bir kanal açar (Open).
2. Sunucu yeni kanalın hazır olduğunu onaylar (Open-Ok).
3. İstemci ve sunucu kanalı istenildiği gibi kullanır.
4. Bir eş (istemci veya sunucu) kanalı kapatır (Close).
5. Diğer eş kanal kapatmayı el sıkışarak onaylar (Close-Ok).
Yeni bir kanal oluşturmak için OpenChannel metodunu çağırmanız ve kanal adını bağımsız değişken olarak geçirmeniz yeterlidir. OnAMQPChannelOpen olayı, kanalın açıldığına dair sunucu tarafından gönderilen bir onay olarak tetiklenir.
AMQP.OpenChannel('channel_name');
procedure OnAMQPChannelOpen(Sender: TObject; const aChannel: string);
begin
DoLog('#AMQP_channel_open: ' + aChannel);
end;
Exchange'ler
Exchange sınıfı, bir uygulamanın sunucudaki exchange'leri yönetmesini sağlar. Bu sınıf, uygulamanın (bir yapılandırma arayüzüne güvenmek yerine) kendi bağlantısını betiklemesine olanak tanır. Not: Çoğu uygulama bu düzeyde karmaşıklığa ihtiyaç duymaz ve eski ara katman yazılımının bu semantiği destekleyebilmesi olası değildir.
Exchange yaşam döngüsü şudur:
1. İstemci, sunucudan exchange'in var olduğundan emin olmasını ister (Declare). İstemci bunu "exchange yoksa oluştur" veya "yoksa beni uyar ama oluşturma" şeklinde belirleyebilir.
2. İstemci exchange'e mesaj yayınlar.
3. İstemci exchange'i silmeyi seçebilir (Delete).
DeclareExchange metodu yeni bir exchange oluşturur veya bir Exchange'in zaten var olduğunu doğrular. Metot aşağıdaki bağımsız değişkenlere sahiptir:
- ChannelName: kanalın adıdır (bu metot çağrılmadan önce açık olmalıdır).
- ExchangeName: exchange'in adıdır, 255 karakterden uzun olmamalı ve "amq." ile başlamamalıdır (passive parametresi true ise hariç).
- ExchangeType: exchange türüdür, tüm AMQP sunucuları "direct" ve "fanout" exchange'leri destekler. Hangi exchange türlerinin desteklendiğini öğrenmek için sunucu belgelerini kontrol edin.
- Passive: passive true ise, sunucu yalnızca exchange'in zaten bildirildiğini doğrular. Passive false ise ve exchange yoksa, sunucu yeni bir tane oluşturur.
- Durable: true ise, exchange sunucu başladığında yeniden oluşturulur. False ise, exchange sunucu durduğunda silinir.
- AutoDelete: true ise, tüm kuyrukların bağlantısı kaldırıldığında exchange silinir.
- Internal: her zaman false.
- NoWait: true ise, sunucu istemciye bir onay göndermez.
Yeni bir Exchange Bildirmek için DeclareExchange metodunu çağırmanız ve kanal adını, exchange adını ve exchange türünü bağımsız değişken olarak geçirmeniz yeterlidir. OnAMQPExchangeDeclare olayı, exchange'in bildirildiğine dair sunucu tarafından gönderilen bir onay olarak tetiklenir.
AMQP.DeclareExchange('channel_name', 'exchange_name', 'direct');
procedure OnAMQPExchangeDeclare(Sender: TObject; const aChannel, aExchange: string);
begin
DoLog('#AMQP_exchange_declare: [' + aChannel + '] ' + aExchange);
end;
Kuyruklar
Queue sınıfı, bir uygulamanın sunucudaki mesaj kuyruklarını yönetmesini sağlar. Bu, mesaj tüketen neredeyse tüm uygulamalarda, en azından beklenen bir mesaj kuyruğunun gerçekten mevcut olduğunu doğrulamak için temel bir adımdır.
Kalıcı bir mesaj kuyruğunun yaşam döngüsü oldukça basittir:
1. İstemci mesaj kuyruğunun var olduğunu öne sürer (Declare, "passive" bağımsız değişkeniyle).
2. Sunucu mesaj kuyruğunun var olduğunu onaylar (Declare-Ok).
3. İstemci mesaj kuyruğundan mesajları okur.
Geçici bir mesaj kuyruğunun yaşam döngüsü daha ilginçtir:
1. İstemci mesaj kuyruğunu oluşturur (Declare, genellikle mesaj kuyruğu adı olmadan, böylece sunucu bir ad atar). Sunucu onaylar (Declare-Ok).
2. İstemci mesaj kuyruğunda bir tüketici başlatır. Bir tüketicinin kesin işlevselliği Basic sınıfı tarafından tanımlanır.
3. İstemci, açıkça veya kanalı ve/veya bağlantıyı kapatarak tüketiciyi iptal eder.
4. Son tüketici mesaj kuyruğundan kaybolduğunda ve nazik bir zaman aşımından sonra sunucu mesaj kuyruğunu siler.
AMQP, konu abonelikleri için teslim mekanizmasını mesaj kuyrukları olarak uygular. Bu, bir aboneliğin iş birliği yapan bir abone havuzu arasında yük dengelenebileceği ilginç yapıları mümkün kılar
uygulamalar.
Bir aboneliğin yaşam döngüsü ekstra bir bağlama aşaması içerir:
1. İstemci mesaj kuyruğunu oluşturur (Declare) ve sunucu onaylar (Declare-Ok).
2. İstemci mesaj kuyruğunu bir konu exchange'ine bağlar (Bind) ve sunucu onaylar (Bind-Ok).
3. İstemci mesaj kuyruğunu önceki örneklerdeki gibi kullanır.
DeclareQueue metodu yeni bir kuyruk oluşturur veya bir Kuyruğun zaten var olduğunu doğrular. Metot aşağıdaki bağımsız değişkenlere sahiptir:
- ChannelName: kanalın adıdır (bu metot çağrılmadan önce açık olmalıdır).
- QueueName: kuyruğun adıdır, 255 karakterden uzun olmamalı ve "amq." ile başlamamalıdır (passive parametresi true ise hariç).
- Passive: passive true ise, sunucu yalnızca kuyruğun zaten bildirildiğini doğrular. Passive false ise ve kuyruk yoksa, sunucu yeni bir tane oluşturur.
- Durable: true ise, kuyruk sunucu başladığında yeniden oluşturulur. False ise, kuyruk sunucu durduğunda silinir.
- Exclusive: true ise, kuyruğa yalnızca geçerli bağlantı tarafından erişildiği anlamına gelir.
- AutoDelete: true ise, tüm tüketiciler kuyruğu artık kullanmadığında kuyruk silinir.
- NoWait: true ise, sunucu istemciye bir onay göndermez.
Yeni bir Kuyruk Bildirmek için DeclareQueue metodunu çağırmanız ve kanal adını ve kuyruk adını bağımsız değişken olarak geçirmeniz yeterlidir. OnAMQPQueueDeclare olayı, exchange'in bildirildiğine dair sunucu tarafından gönderilen bir onay olarak tetiklenir.
AMQP.DeclareQueue('channel_name', 'queue_name');
procedure OnAMQPQueueDeclare(Sender: TObject; const aChannel, aQueue: string; aMessageCount, aConsumerCount: Integer);
begin
DoLog('#AMQP_queue_declare: [' + aChannel + '] ' + aQueue);
end;
