Panduan protokol AMQP 1.0 di Azure Service Bus dan Azure Event Hubs

Advanced Message Queueing Protocol (AMQA) 1.0 adalah protokol pembingkaian dan transfer standar untuk mentransfer pesan secara asinkron, aman, dan andal antara dua pihak. Ini adalah protokol utama Olahpesan Azure Service Bus dan Azure Event Hubs.

AMQP 1.0 adalah hasil kolaborasi industri luas yang menggabungkan vendor middleware, seperti Microsoft dan Red Hat, dengan banyak pengguna middleware oleh pesan seperti JP Morgan Chase yang mewakili industri jasa keuangan. Forum standardisasi teknis untuk protokol AMQP dan spesifikasi ekstensi adalah OASIS, dan telah memperoleh persetujuan formal sebagai standar internasional sebagai ISO/IEC 19494:2014.

Sasaran

Artikel ini merangkum konsep inti spesifikasi olah pesan AMQP 1.0 beserta spesifikasi ekstensi yang dikembangkan oleh Komite Teknis AMQP OASIS dan menjelaskan bagaimana Azure Service Bus menerapkan dan menyusun spesifikasi ini.

Tujuannya adalah agar setiap pengembang yang menggunakan tumpukan klien AMQP 1.0 yang ada di platform apa pun dapat berinteraksi dengan Azure Service Bus melalui AMQP 1.0.

Tumpukan AMQP 1.0 serbaguna umum, seperti Apache Qpid Proton atau AMQP.NET Lite, mengimplementasikan semua elemen protokol AMQP 1.0 inti seperti sesi atau tautan. Elemen dasar tersebut terkadang dibalut dengan API tingkat yang lebih tinggi; Apache Proton bahkan menawarkan dua API, API Messenger imperatif dan Reactor API reaktif.

Dalam diskusi berikut, kami berasumsi bahwa manajemen koneksi, sesi, dan tautan AMQP serta penanganan transfer bingkai dan kontrol aliran ditangani oleh masing-masing tumpukan (seperti Apache Proton-C) dan tidak memerlukan banyak jika ada perhatian khusus dari pengembang aplikasi. Kami secara abstrak mengasumsikan keberadaan beberapa fungsi API seperti kemampuan untuk terhubung, dan membuat beberapa bentuk objek abstraksi pengirim dan penerima, yang kemudian memiliki beberapa bentuk operasi send() dan receive() masing-masing.

Saat membahas kemampuan lanjutan Azure Service Bus, seperti penelusuran pesan atau pengelolaan sesi, fitur tersebut dijelaskan dalam istilah AMQP, tetapi juga sebagai implementasi semu berlapis selain asumsi abstraksi API.

Apa itu AMQP?

AMQP adalah protokol pembingkaian dan transfer. Pembingkaian berarti bahwa AMQP menyediakan struktur untuk aliran data biner yang mengalir di salah satu arah koneksi jaringan. Struktur ini menyediakan delineasi untuk blok data yang berbeda, yang disebut bingkai, untuk dipertukarkan antara pihak-pihak yang terhubung. Kemampuan transfer memastikan bahwa kedua pihak yang berkomunikasi dapat membangun pemahaman bersama tentang kapan bingkai harus ditransfer, dan kapan transfer harus dianggap selesai.

Tidak seperti versi draf yang kedaluwarsa sebelumnya dari grup kerja AMQP yang masih digunakan oleh beberapa broker pesan, protokol AMQP 1.0 akhir grup kerja, dan standar tidak meresepkan keberadaan broker pesan atau topologi tertentu untuk entitas di dalam broker pesan.

Protokol ini dapat digunakan untuk komunikasi peer-to-peer simetris, untuk interaksi dengan broker pesan yang mendukung antrean dan memublikasikan/berlangganan entitas, seperti yang dilakukan Azure Service Bus. Protokol Ini juga dapat digunakan untuk interaksi dengan infrastruktur olah pesan tempat pola interaksi berbeda dengan antrean reguler, seperti halnya dengan Azure Event Hubs. Sebuah hub peristiwa bertindak seperti antrean saat peristiwa dikirim ke sana, tetapi bertindak lebih seperti layanan penyimpanan serial saat peristiwa dibaca darinya; agak menyerupai drive tape. Klien memilih offset ke aliran data yang tersedia dan kemudian dilayani semua peristiwa dari offset tersebut hingga yang terbaru tersedia.

Protokol AMQP 1.0 dirancang agar dapat diperluas, sehingga spesifikasi lebih lanjut dapat ditingkatkan kemampuannya. Tiga spesifikasi ekstensi yang dibahas dalam dokumen ini menggambarkan hal ini. Untuk komunikasi melalui infrastruktur HTTPS/WebSockets yang ada, mengonfigurasi port TCP AMQP asli mungkin sulit. Spesifikasi terikat menentukan cara melapisi AMQP melalui WebSocket. Untuk berinteraksi dengan infrastruktur olah pesan dalam mode permintaan/respons untuk tujuan pengelolaan atau untuk menyediakan fungsi lanjutan, spesifikasi pengelolaan AMQP menentukan fungsi interaksi dasar yang diperlukan. Untuk integrasi model otorisasi federasi, spesifikasi keamanan berbasis klaim AMQP menentukan cara mengaitkan dan memperbarui token otorisasi yang terkait dengan tautan.

Skenario AMQP dasar

Bagian ini menjelaskan penggunaan dasar AMQP 1.0 dengan Azure Service Bus, yang mencakup pembuatan koneksi, sesi, dan tautan, serta mentransfer pesan ke dan dari entitas Azure Service Bus seperti antrean, topik, dan langganan.

Sumber yang paling otoritatif untuk mempelajari cara kerja AMQP adalah spesifikasi AMQP 1.0, tetapi spesifikasinya ditulis untuk secara tepat memandu implementasi dan tidak mengajarkan protokol. Bagian ini berfokus pada pengantar terminologi yang diperlukan untuk menggambarkan cara Service Bus menggunakan AMQP 1.0. Untuk pengantar AMQP yang lebih komprehensif, serta diskusi AMQP 1.0 yang lebih luas, Anda dapat meninjau kursus video ini.

Koneksi dan sesi

AMQP memanggil kontainer program komunikasi kontainer; yang berisi simpul, yang merupakan entitas komunikasi di dalam kontainer tersebut. Antrean bisa berupa simpul seperti itu. AMQP memungkinkan multipleksi, sehingga koneksi tunggal dapat digunakan untuk berbagai jalur komunikasi antar simpul; misalnya, klien aplikasi dapat menerima secara bersamaan dari satu antrean dan mengirim ke antrean lain melalui koneksi jaringan yang sama.

Diagram showing Sessions and Connections between containers.

Koneksi jaringan dengan demikian berlabuh pada kontainer. Hal ini diinisiasi oleh kontainer dalam peran klien dalam membuat koneksi soket TCP keluar ke kontainer dalam peran penerima, yang mendengarkan dan menerima koneksi TCP masuk. Jabat tangan koneksi termasuk menegosiasikan versi protokol, menyatakan atau menegosiasikan penggunaan Transport Level Security (TLS/SSL), dan jabat tangan otentikasi/otorisasi pada lingkup koneksi yang didasarkan pada SASL.

Azure Service Bus dan Azure Event Hubs memerlukan penggunaan TLS setiap saat. Ini mendukung koneksi melalui TCP port 5671, di mana koneksi TCP pertama kali dilapisi dengan TLS sebelum memasuki jabat tangan protokol AMQP, dan juga mendukung koneksi melalui TCP port 5672 di mana server segera menawarkan peningkatan koneksi wajib ke TLS menggunakan model yang ditentukan AMQP. Pengikatan AMQP WebSockets membuat terowongan melalui TCP port 443 yang kemudian setara dengan koneksi AMQP 5671.

Setelah menyiapkan koneksi dan TLS, Azure Service Bus menawarkan dua opsi mekanisme SASL:

  • SASL PLAIN umumnya digunakan untuk meneruskan info masuk nama pengguna dan kata sandi ke server. Azure Service Bus tidak memiliki akun, tetapi bernama aturan Keamanan Akses Bersama, yang memberikan hak dan dikaitkan dengan kunci. Nama aturan digunakan sebagai nama pengguna dan kunci (sebagai teks berkode base64) digunakan sebagai kata sandi. Hak yang terkait dengan aturan yang dipilih mengatur operasi yang diizinkan pada koneksi.
  • SASL ANONYMOUS digunakan untuk melewati otorisasi SASL saat klien ingin menggunakan model keamanan berbasis klaim (CBS) yang akan dijelaskan nanti. Dengan opsi ini, koneksi klien dapat dibuat secara anonim untuk waktu yang singkat yang pada periode tersebut hanya dapat berinteraksi dengan titik akhir CBS dan jabat tangan CBS harus selesai.

Setelah koneksi transmisi dibuat, masing-masing kontainer menyatakan ukuran bingkai maksimum yang akan mereka handel, dan setelah waktu idle habis, mereka akan diputus secara sepihak jika tidak ada aktivitas pada koneksi.

Kontainer tersebut juga menyatakan banyaknya saluran serempak yang didukung. Saluran adalah jalur transfer virtual, keluar, dan satu arah selain koneksi. Sesi mengambil saluran dari masing-masing kontainer yang saling terhubung untuk membentuk jalur komunikasi dua arah.

Sesi memiliki model kontrol aliran berbasis jendela; saat sesi dibuat, tiap pihak menyatakan banyaknya bingkai yang bersedia diterima ke dalam jendela penerimanya. Saat para pihak bertukar bingkai, bingkai yang ditransfer akan mengisi jendela tersebut dan transfer dihentikan saat jendela penuh dan hingga jendela diatur ulang atau diperluas menggunakan performatif alur (performatif adalah istilah AMQP untuk gerakan tingkat protokol yang dipertukarkan antara kedua belah pihak).

Model berbasis jendela ini kira-kira dianalogikan dengan konsep TCP kontrol alur berbasis jendela, tetapi pada tingkat sesi di dalam soket. Konsep protokol yang memungkinkan keberadaan sesi secara bersamaan sehingga lalu lintas prioritas tinggi dapat dilarikan melewati lalu lintas normal yang dicekik, seperti di jalur ekspres jalan bebas hambatan.

Azure Service Bus saat ini menggunakan tepat satu sesi untuk setiap koneksi. Ukuran bingkai maksimum Azure Bus Servis 262.144 byte (256-K byte) untuk Azure Service Bus Standard. 1048576 (100 MB) untuk Azure Service Bus Premium dan Azure Event Hubs. Azure Service Bus tidak menerapkan jendela pembatasan tingkat sesi tertentu, tetapi mengatur ulang jendela secara reguler sebagai bagian dari kontrol alur tingkat tautan (lihat bagian berikutnya).

Koneksi, saluran, dan sesi bersifat sementara. Jika koneksi yang mendasarinya putus, sesi, konteks otorisasi SASL, terowongan TLS, dan koneksi harus dibangun kembali.

Persyaratan port keluar AMQP

Klien yang menggunakan koneksi AMQP melalui TCP mengharuskan port 5671 dan 5672 dibuka di firewall lokal. Selain port ini, port tambahan mungkin perlu dibuka jika fitur EnableLinkRedirect diaktifkan. EnableLinkRedirect adalah fitur olah pesan baru yang membantu melewati satu hop saat menerima pesan, sehingga membantu meningkatkan throughput. Klien dapat mulai berkomunikasi langsung dengan layanan back-end melalui rentang port 104XX seperti yang ditunjukkan pada gambar berikut.

List of destination ports

Klien .NET akan gagal dengan SocketException ("Upaya dilakukan untuk mengakses soket dengan cara yang dilarang oleh izin aksesnya") jika port ini diblokir oleh firewall. Fitur ini dapat dinonaktifkan dengan mengatur EnableAmqpLinkRedirect=false di string koneksi, yang memaksa klien untuk berkomunikasi dengan layanan jarak jauh melalui port 5671.

Pengikatan AMQP WebSocket menyediakan mekanisme untuk terowongan koneksi AMQP melalui transportasi WebSocket. Pengikatan ini membuat terowongan melalui port TCP 443, yang setara dengan koneksi AMQP 5671. Gunakan AMQP WebSockets jika Anda berada di belakang firewall yang memblokir koneksi TCP melalui port 5671, 5672 tetapi memungkinkan koneksi TCP melalui port 443 (https).

AMQP mentransfer pesan melalui tautan. Tautan adalah jalur komunikasi yang dibuat selama sesi yang memungkinkan transfer pesan dalam satu arah; negosiasi status transfer dilakukan melalui tautan dan dua arah antara pihak-pihak yang terhubung.

Screenshot showing a Session carrying a link connection between two containers.

Tautan dapat dibuat oleh kontainer kapan saja dan selama sesi yang ada, yang membuat AMQP berbeda dengan kebanyakan protokol lain, termasuk HTTP dan MQTT, di mana inisiasi transfer dan jalur transfer adalah hak istimewa eksklusif pihak yang membuat koneksi soket.

Kontainer yang memulai tautan meminta kontainer yang berlawanan untuk menerima tautan dan kontainer ini memilih peran pengirim atau penerima. Oleh karena itu, salah satu kontainer dapat memulai pembuatan jalur komunikasi satu arah atau dua arah, dengan yang terakhir yang dimodelkan sebagai pasangan tautan.

Tautan diberi nama dan dikaitkan dengan simpul. Seperti yang dinyatakan di awal, simpul adalah entitas komunikasi di dalam kontainer.

Di Azure Service Bus, simpul secara langsung setara dengan antrean, topik, langganan, atau sub-antrean surat mati dari antrean atau langganan. Oleh karena itu, nama simpul yang digunakan dalam AMQP adalah nama relatif entitas di dalam namespace Azure Service Bus. Jika antrean diberi nama myqueue, ini menjadi nama simpul AMQP-nya. Langganan topik mengikuti konvensi HTTP API dengan diurutkan ke dalam koleksi sumber daya "langganan," sehingga langganan sub pada topik mytopic memiliki nama simpul AMQP mytopic/subscriptions/sub.

Klien penghubung juga diharuskan menggunakan nama node lokal untuk membuat tautan; Azure Service Bus tidak reseptif tentang nama node tersebut dan tidak menafsirkannya. Tumpukan klien AMQP 1.0 umumnya menggunakan skema untuk memastikan bahwa nama simpul sementara ini unik dalam lingkup klien.

Transfer

Setelah tautan dibuat, pesan dapat ditransfer melalui tautan tersebut. Di AMQP, transfer dijalankan dengan gerakan protokol eksplisit (performatif transfer) yang memindahkan pesan dari pengirim ke penerima melalui tautan. Transfer selesai ketika "diselesaikan", yang berarti bahwa kedua belah pihak telah saling memahami tentang hasil transfer itu.

A diagram showing a message's transfer between the Sender and Receiver and disposition that results from it.

Dalam kasus yang paling sederhana, pengirim dapat memilih untuk mengirim pesan "diselesaikan sebelumnya," yang berarti bahwa klien tidak tertarik pada hasilnya dan penerima tidak memberikan umpan balik tentang hasil operasi. Mode ini didukung oleh Azure Service Bus di tingkat protokol AMQP, tetapi tidak terekspos dalam API klien mana pun.

Kasus umumnya adalah bahwa pesan dikirim dalam kondisi tidak diselesaikan, dan penerima kemudian menunjukkan penerimaan atau penolakan menggunakan disposisi performatif. Penolakan terjadi jika penerima tidak dapat menerima pesan karena alasan apa pun, dan pesan penolakan berisi informasi tentang alasannya, yang merupakan struktur kesalahan yang ditentukan oleh AMQP. Jika pesan ditolak karena kesalahan internal di dalam Azure Service Bus, layanan akan menampilkan informasi tambahan di dalam struktur yang dapat digunakan untuk memberikan petunjuk diagnostik untuk mendukung personil jika Anda mengajukan permintaan dukungan. Anda akan mempelajari detail selengkapnya tentang kesalahan nanti.

Bentuk penolakan khusus adalah keadaan yang dirilis, yang menunjukkan bahwa penerima tidak memiliki keberatan teknis terhadap transfer, tetapi juga tidak tertarik untuk menyelesaikan transfer. Kasus tersebut terjadi, misalnya, jika pesan dikirimkan ke klien Azure Service Bus, dan klien memilih untuk "meninggalkan" pesan karena tidak dapat melakukan pekerjaan yang dihasilkan dari pemrosesan pesan; pengiriman pesan itu sendiri bukanlah kesalahan. Variasi status tersebut adalah status modifikasi, yang memungkinkan perubahan pada pesan saat dirilis. Status tersebut saat ini tidak digunakan oleh Azure Service Bus.

Spesifikasi AMQP 1.0 menentukan status disposisi lebih lanjut yang disebut diterima, yang secara khusus membantu menangani pemulihan tautan. Pemulihan tautan memungkinkan rekonstitusi status tautan dan semua pengiriman yang tertunda selain koneksi dan sesi baru, ketika koneksi dan sesi sebelumnya hilang.

Bus Layanan tidak mendukung pemulihan tautan; jika klien kehilangan koneksi ke Bus Layanan dengan transfer pesan yang tidak dibatasi tertunda, transfer pesan tersebut hilang, dan klien harus terhubung kembali, membangun kembali tautan, dan mencoba kembali transfer.

Dengan demikian, Azure Service Bus dan Azure Event Hubs mendukung transfer "setidaknya sekali" saat pengirim dapat diyakinkan bahwa pesan telah disimpan dan diterima, tetapi tidak mendukung transfer "tepat sekali" di tingkat AMQP, saat sistem akan berusaha memulihkan tautan dan terus menegosiasikan status pengiriman untuk menghindari duplikasi transfer pesan.

Untuk mengimbangi kemungkinan pengiriman duplikat, Azure Service Bus mendukung deteksi duplikat sebagai fitur opsional pada antrean dan topik. Deteksi duplikat mencatat ID pesan semua pesan masuk selama periode waktu yang ditentukan pengguna, lalu secara diam-diam menghilangkan semua pesan yang dikirim dengan ID pesan yang sama selama periode yang sama.

Kontrol alur

Selain model kontrol aliran tingkat sesi yang sebelumnya dibahas, setiap tautan memiliki model kontrol alirannya sendiri. Kontrol aliran tingkat sesi mencegah kontainer menangani terlalu banyak bingkai sekaligus, kontrol aliran tingkat tautan menempatkan aplikasi untuk menangani banyaknya pesan yang ingin ditangani dari tautan dan kapan.

Screenshot of a log showing Source, Destination, Source Port, Destination Port, and Protocol Name. In the first row the Destination Port 10401 (0x28 A 1) is outlined in black.

Pada tautan, transfer hanya dapat dilakukan jika pengirim memiliki kredit tautan yang cukup. Kredit tautan adalah penghitung yang ditetapkan oleh penerima menggunakan performatif aliran, yang dicakup ke tautan. Saat pengirim diberi kredit tautan, pengirim mencoba menghabiskan kredit tersebut dengan mengirimkan pesan. Setiap pengiriman pesan akan mengurangi sisa kredit tautan sebesar 1. Saat kredit tautan habis, pengiriman berhenti.

Jika Azure Service Bus berada dalam peran penerima, kredit tautan yang cukup akan langsung diberikan kepada pengirim, sehingga pesan dapat segera dikirim. Saat kredit tautan digunakan, Azure Service Bus sesekali mengirimkan performatif aliran kepada pengirim untuk memperbarui saldo kredit tautan.

Dalam peran pengirim, Azure Service Bus mengirim pesan untuk menghabiskan kredit tautan yang tersisa.

Panggilan "terima" di tingkat API diterjemahkan menjadi performatif aliran yang dikirim ke Azure Service Bus oleh klien, dan Azure Service Bus menggunakan kredit tersebut dengan mengambil pesan pertama yang tersedia dan tidak terkunci dari antrian, menguncinya, lalu mentransfernya. Jika tidak ada pesan yang tersedia untuk dikirim, semua kredit yang tersisa oleh tautan apa pun yang dibuat dengan entitas tertentu tetap dicatat dalam urutan kedatangan, dan pesan dikunci dan ditransfer saat tersedia, untuk menggunakan kredit yang tersisa.

Kunci pada pesan dilepaskan saat transfer diselesaikan ke salah satu status terminal diterima, ditolak, atau dirilis. Pesan dihapus dari Azure Service Bus ketika status terminal diterima. Ini tetap berada di Azure Service Bus dan dikirim ke penerima berikutnya saat transfer mencapai salah satu status lainnya. Azure Service Bus otomatis memindahkan pesan ke dalam antrean surat mati entitas saat mencapai jumlah pengiriman maksimum yang diizinkan untuk entitas karena penolakan atau pelepasan ulang.

Meski Azure Service Bus API tidak langsung mengekspos opsi seperti itu hari ini, klien protokol AMQP tingkat bawah dapat menggunakan model kredit tautan untuk mengubah interaksi "gaya tarik" dalam mengeluarkan satu unit kredit untuk setiap permintaan penerimaan menjadi model "gaya dorong" dengan mengeluarkan sejumlah besar kredit tautan dan kemudian menerima pesan saat tersedia tanpa interaksi lebih lanjut. Pendorongan didukung melalui pengaturan properti ServiceBusProcessor.PrefetchCount atau ServiceBusReceiver.PrefetchCount . Ketika pengaturan tersebut non-nol, klien AMQP menggunakannya sebagai kredit tautan.

Dalam konteks ini, perlu dipahami bahwa jam kedaluwarsa untuk kunci pada pesan di dalam entitas akan dimulai saat pesan diambil dari entitas, bukan saat pesan dimasukkan di kabel. Setiap kali klien menunjukkan kesiapan untuk menerima pesan dengan mengeluarkan kredit tautan, klien diharapkan secara aktif menarik pesan di seluruh jaringan dan siap menanganinya. Jika tidak, kunci pesan mungkin telah kedaluwarsa sebelum pesan bahkan dikirimkan. Penggunaan kontrol aliran kredit tautan harus langsung mencerminkan kesiapan langsung untuk menangani pesan yang tersedia yang dikirim ke penerima.

Singkatnya, bagian berikut ini memberikan ringkasan skematik tentang aliran performatif selama interaksi API yang berbeda. Setiap bagian menjelaskan operasi logika yang berbeda. Beberapa interaksi tersebut mungkin "malas", yang berarti mereka mungkin hanya dilakukan jika diperlukan. Membuat pengirim pesan mungkin tidak menyebabkan interaksi jaringan hingga pesan pertama dikirim atau diminta.

Tanda panah dalam tabel berikut memperlihatkan arah aliran performatif.

Membuat penerima pesan

Klien Service Bus
--> attach(<br/>name={link name},<br/>handle={numeric handle},<br/>role=**receiver**,<br/>source={entity name},<br/>target={client link ID}<br/>) Klien melampirkan ke entitas sebagai penerima
Balasan Azure Service Bus melampirkan akhiran tautannya <-- attach(<br/>name={link name},<br/>handle={numeric handle},<br/>role=**sender**,<br/>source={entity name},<br/>target={client link ID}<br/>)

Membuat pengirim pesan

Klien Service Bus
--> attach(<br/>name={link name},<br/>handle={numeric handle},<br/>role=**sender**,<br/>source={client link ID},<br/>target={entity name}<br/>) Tidak ada tindakan
Tidak ada tindakan <-- attach(<br/>name={link name},<br/>handle={numeric handle},<br/>role=**receiver**,<br/>source={client link ID},<br/>target={entity name}<br/>)

Membuat pengirim pesan (kesalahan)

Klien Service Bus
--> attach(<br/>name={link name},<br/>handle={numeric handle},<br/>role=**sender**,<br/>source={client link ID},<br/>target={entity name}<br/>) Tidak ada tindakan
Tidak ada tindakan <-- attach(<br/>name={link name},<br/>handle={numeric handle},<br/>role=**receiver**,<br/>source=null,<br/>target=null<br/>)<br/><br/><-- detach(<br/>handle={numeric handle},<br/>closed=**true**,<br/>error={error info}<br/>)

Menutup penerima/pengirim pesan

Klien Service Bus
--> detach(<br/>handle={numeric handle},<br/>closed=**true**<br/>) Tidak ada tindakan
Tidak ada tindakan <-- detach(<br/>handle={numeric handle},<br/>closed=**true**<br/>)

Kirim (berhasil)

Klien Service Bus
--> transfer(<br/>delivery-id={numeric handle},<br/>delivery-tag={binary handle},<br/>settled=**false**,,more=**false**,<br/>state=**null**,<br/>resume=**false**<br/>) Tidak ada tindakan
Tidak ada tindakan <-- disposition(<br/>role=receiver,<br/>first={delivery ID},<br/>last={delivery ID},<br/>settled=**true**,<br/>state=**accepted**<br/>)

Kirim (kesalahan)

Klien Service Bus
--> transfer(<br/>delivery-id={numeric handle},<br/>delivery-tag={binary handle},<br/>settled=**false**,,more=**false**,<br/>state=**null**,<br/>resume=**false**<br/>) Tidak ada tindakan
Tidak ada tindakan <-- disposition(<br/>role=receiver,<br/>first={delivery ID},<br/>last={delivery ID},<br/>settled=**true**,<br/>state=**rejected**(<br/>error={error info}<br/>)<br/>)

Terima

Klien Service Bus
--> flow(<br/>link-credit=1<br/>) Tidak ada tindakan
Tidak ada tindakan < transfer(<br/>delivery-id={numeric handle},<br/>delivery-tag={binary handle},<br/>settled=**false**,<br/>more=**false**,<br/>state=**null**,<br/>resume=**false**<br/>)
--> disposition(<br/>role=**receiver**,<br/>first={delivery ID},<br/>last={delivery ID},<br/>settled=**true**,<br/>state=**accepted**<br/>) Tidak ada tindakan

Penerimaan multi-pesan

Klien Service Bus
--> flow(<br/>link-credit=3<br/>) Tidak ada tindakan
Tidak ada tindakan < transfer(<br/>delivery-id={numeric handle},<br/>delivery-tag={binary handle},<br/>settled=**false**,<br/>more=**false**,<br/>state=**null**,<br/>resume=**false**<br/>)
Tidak ada tindakan < transfer(<br/>delivery-id={numeric handle+1},<br/>delivery-tag={binary handle},<br/>settled=**false**,<br/>more=**false**,<br/>state=**null**,<br/>resume=**false**<br/>)
Tidak ada tindakan < transfer(<br/>delivery-id={numeric handle+2},<br/>delivery-tag={binary handle},<br/>settled=**false**,<br/>more=**false**,<br/>state=**null**,<br/>resume=**false**<br/>)
--> disposition(<br/>role=receiver,<br/>first={delivery ID},<br/>last={delivery ID+2},<br/>settled=**true**,<br/>state=**accepted**<br/>) Tidak ada tindakan

Pesan

Bagian berikut menjelaskan properti dari bagian pesan AMQP standar yang digunakan oleh Azure Service Bus dan bagaimana properti tersebut dipetakan ke rangkaian Azure Service Bus API.

Properti apa pun yang perlu didefinisikan aplikasi harus dipetakan ke peta application-properties AMQP.