ApsaraMQ for RocketMQ iki tüketici türü sunar: Push consumer ve Simple consumer. Her tür mesaj edinme, eşzamanlılık ve yeniden deneme işlemlerini farklı şekilde yönetir. İşleme modelinize ve güvenilirlik gereksinimlerinize uygun türü seçin.
Hangi tüketici türünü kullanmalısınız?
| Senaryo | Önerilen tür | Neden |
|---|---|---|
| Öngörülebilir işleme süresi, özel iş parçacığı gerekmez | Push consumer | SDK mesaj getirme, eşzamanlılık ve yeniden deneme işlemlerini yönetir. Bir dinleyici kaydedin, her mesajı işleyin ve sonucu döndürün. |
| Değişken işleme süresi, özel iş akışları | Simple consumer | Uygulamanız mesajların ne zaman getirileceğini, iş parçacıklarına nasıl dağıtılacağını ve işlemin ne zaman tamamlandığının onaylanacağını kontrol eder. |
Tüketici türünü değiştirmek mevcut ApsaraMQ for RocketMQ kaynaklarını veya iş süreçlerini etkilemez.
Mesaj işleme aşamaları
Her iki tüketici türü de üç aşamalı bir yaşam döngüsü izler:
Alma -- Sunucudan mesajları getirin.
İşleme -- Her mesaj üzerinde iş mantığını çalıştırın.
Onaylama -- Sonucu (başarılı veya başarısız) sunucuya bildirin.

Bu iki tür her aşamanın nasıl ele alındığı konusunda farklılık gösterir:
| Özellik | Push consumer | Simple consumer |
|---|---|---|
| Arayüz | Dinleyici geri araması -- mantığı dinleyici içinde uygulayın ve sonuç döndürün | Uygulama mesajları almak, işlemek ve onaylamak için API işlemlerini çağırır |
| Eşzamanlılık | SDK tarafından yönetilir | Uygulama tarafından yönetilir |
| Esneklik | Yüksek düzeyde kapsüllenmiş, daha az esnek | Atomik işlemler, yüksek düzeyde özelleştirilebilir |
| En uygun kullanım alanı | Öngörülebilir işleme süresine sahip standart tüketim | Özel iş akışları, zaman uyumsuz dağıtım veya toplu iş tüketimi |
| SDK sınıfları | PushConsumer, LitePushConsumer |
SimpleConsumer |
Push tüketicileri
Bir Push consumer mesaj getirme, iş parçacığı yönetimi ve yeniden deneme mantığını kapsüller. Başlatma sırasında bir mesaj dinleyicisi kaydedin; SDK geri kalanını halleder.
Nasıl çalışır?
SDK dahili olarak bir Reactor iş parçacığı modeli kullanır:
Yerleşik bir uzun oylama iş parçacığı sunucudan mesajları zaman uyumsuz olarak çeker.
Mesajlar dahili bir önbellek kuyruğuna yerleştirilir.
SDK mesajları tüketici iş parçacıklarına dağıtır ve bu iş parçacıkları dinleyicinizi çağırır.

Dinleyici sonuçları
Mesaj dinleyicisi aşağıdaki sonuçlardan birini döndürmelidir:
| Sonuç | Java SDK sabiti | Davranış |
|---|---|---|
| Başarılı | ConsumeResult.SUCCESS |
Sunucu tüketim ilerlemesini günceller. |
| Başarısız | ConsumeResult.FAILURE |
Sistem PushConsumer yeniden deneme ilkesi temelinde yeniden dener. |
| Özel durum oluştu | (başarısız olarak değerlendirilir) | Açık bir başarısızlıkla aynı yeniden deneme davranışı. |
Zaman aşımı davranışı
İşleme mantığı engellenirse ve mesajın izin verilen süre içinde tamamlanmasını önlerse SDK zorla bir başarısızlık sonucu gönderir ve mesajı yeniden deneme ilkesine göre işler.
Zaman aşımı SDK'nın bir başarısızlık sonucu göndermesine neden olur ancak geçerli işleme iş parçacığı kesintiyi yanıtlamayabilir ve çalışmaya devam edebilir.
Güvenilirlik kısıtlamaları
Push consumer başarı veya başarısızlığı kesinlikle dinleyici dönüş değerine göre belirler. Bu garantinin korunması için:
Zaman uyumlu işleyin. Sonucu döndürmeden önce tüm işlemleri tamamlayın.
Mesajları yeniden dağıtmayın. Mesajları diğer iş parçacıklarına devretmeyin ve bu iş parçacıkları bitmeden sonucu döndürmeyin.
Dinleyici işleme tamamlanmadan önce başarılı döner ve işleme daha sonra başarısız olursa sunucu mesajın tüketildiğini varsayar ve yeniden denemez.
Sıralı mesaj teslimi
Bir tüketici grubu sıralı tüketim modunu kullandığında Push consumer dinleyiciyi ek yapılandırma olmadan sıkı mesaj sırasına göre çağırır. Daha fazla bilgi için bkz. Sıralı mesajlar.
Sıralı teslimat zaman uyumlu işlemeyi gerektirir. Dinleyici içindeki özel zaman uyumsuz dağıtım sıralama garantisini geçersiz kılar.
Push tüketicilerini ne zaman kullanmalısınız?
Push tüketicileri şu durumlarda en iyi performansı gösterir:
İşleme süresi öngörülebilir. Öngörülemeyen süreler sık zaman aşımlarına neden olur; bu da yeniden denemeler yoluyla yinelenen mesajlara yol açar.
Standart tüketim yeterlidir. SDK iş parçacığı modelini kontrol eder ve mesajları maksimum aktarım hızında iletir. Bu geliştirmeyi basitleştirir ancak zaman uyumsuz işlemeyi veya özel hız denetimini desteklemez.
SDK sınıfları
ApsaraMQ for RocketMQ Push tüketicileri için iki SDK sınıfı sağlar:
**
PushConsumer** -- Standart (Lite olmayan) konulardan mesajları tüketir.**
LitePushConsumer** -- Lite tipi konulardan mesajları tüketir; tüketim denetimi Lite konu granülerliğinde yapılır.
PushConsumer örneği
// Consume normal messages with PushConsumer
ClientServiceProvider provider = ClientServiceProvider.loadService();
String topic = "<your-topic>";
FilterExpression filterExpression = new FilterExpression("<your-filter-tag>", FilterExpressionType.TAG);
PushConsumer pushConsumer = provider.newPushConsumerBuilder()
// Set the consumer group
.setConsumerGroup("<your-consumer-group>")
// Set the access endpoint
.setClientConfiguration(ClientConfiguration.newBuilder().setEndpoints("<your-endpoint>").build())
// Bind the subscription
.setSubscriptionExpressions(Collections.singletonMap(topic, filterExpression))
// Register the message listener
.setMessageListener(new MessageListener() {
@Override
public ConsumeResult consume(MessageView messageView) {
// Process the message and return the result
return ConsumeResult.SUCCESS;
}
})
.build();
Aşağıdaki yer tutucuları gerçek değerlerinizle değiştirin:
| Yer tutucu | Açıklama | Örnek |
|---|---|---|
<your-topic> |
Konu adı | order-events |
<your-filter-tag> |
Filtreleme için mesaj etiketi | payment |
<your-consumer-group> |
Tüketici grubu adı | order-service-group |
<your-endpoint> |
Sunucu erişim uç noktası | -- |
LitePushConsumer örneği
// Consume normal messages with LitePushConsumer
ClientServiceProvider provider = ClientServiceProvider.loadService();
LitePushConsumer litePushConsumer = provider.newLitePushConsumerBuilder()
// Set the access endpoint
.setClientConfiguration(ClientConfiguration.newBuilder().setEndpoints("<your-endpoint>").build())
// Set the topic
.bindTopic("<your-topic>")
// Set the consumer group
.setConsumerGroup("<your-consumer-group>")
// Register the message listener
.setMessageListener(messageView -> {
// Process the message and return the result
return ConsumeResult.SUCCESS;
})
.build();
// Subscribe to Lite topics
litePushConsumer.subscribeLite("<your-lite-topic-1>");
litePushConsumer.subscribeLite("<your-lite-topic-2>");
Simple tüketicileri
Bir Simple consumer mesaj işleme için atomik API işlemleri sağlar. Uygulamanız mesaj getirme, iş parçacığı yönetimi ve onaylamayı doğrudan kontrol eder.
Nasıl çalışır?
Sunucudan bir toplu mesaj çekmek için
ReceiveMessageişlemini çağırın.Mesajları işlemek için iş parçacıklarınıza dağıtın.
Başarıyla işlenen her mesaj için
AckMessageişlemini çağırın.
İşleme başarısız olursa onay göndermeyin. Mesaj görünmezlik süresi dolduğunda tekrar kullanılabilir hale gelir ve yeniden deneme tetiklenir. Daha fazla bilgi için bkz. SimpleConsumer yeniden deneme ilkesi.
API işlemleri
| İşlem | Amaç | Anahtar parametreler |
|---|---|---|
ReceiveMessage |
Sunucudan mesajları çekin | Toplu iş boyutu: istek başına mesaj sayısı. Mesaj görünmezlik süresi: mesaj yeniden teslim edilmeden önceki maksimum işleme süresi. |
AckMessage |
Başarılı tüketimi onaylayın | Yok |
ChangeInvisibleDuration |
Zaten alınmış bir mesaj için işleme süresini uzatın | Mesaj görünmezlik süresi: yeni değer; genellikle işlemenin başlangıçta beklenenden daha uzun sürmesi durumunda kullanılır. |
Sunucu dağıtılmış depolama kullandığından mesajlar mevcut olsa bile ReceiveMessage boş bir sonuç döndürebilir. Bunu işlemek için ReceiveMessage işlemini tekrar çağırın veya çağrı eşzamanlılığını artırın.
Hata işleme
Aşağıdaki tabloda farklı hata senaryolarının mesaj teslimini nasıl etkilediği açıklanmaktadır:
| Hata senaryosu | Davranış |
|---|---|
| İşleme başarısız (ACK gönderilmedi) | Görünmezlik süresi dolduğunda mesaj tekrar görünür hale gelir. Sunucu yeniden deneme için mesajı yeniden teslim eder. |
| İşleme görünmezlik süresini aşıyor | ACK gönderilmemesiyle aynıdır -- mesaj görünür hale gelir ve yeniden teslim edilir. Süre dolmadan önce işleme penceresini uzatmak için ChangeInvisibleDuration kullanın. |
| Tüketici ACK göndermeden önce çöküyor | Görünmezlik süresi dolduğunda mesaj yeniden teslim edilir. |
Sıralı mesaj teslimi
Bir Simple consumer sıralı mesajları depolama sırasına göre işler. Sıralı kalması gereken bir mesaj grubu için önceki mesaj işlenmeden sonraki mesaj alınamaz.
Simple tüketicilerini ne zaman kullanmalısınız?
Simple tüketicileri şu durumlarda en iyi performansı gösterir:
İşleme süresi öngörülemez.
ReceiveMessageçağrılırken başlangıç mesaj görünmezlik süresini belirtin; gerekirseChangeInvisibleDurationile bu süreyi uzatın.Özel iş akışları gereklidir. SDK herhangi bir iş parçacığı modeli empoze etmez; zaman uyumsuz dağıtım, toplu iş tüketimi veya herhangi bir özel düzeni uygulayın.
Hız denetimi önemlidir. Kodunuz
ReceiveMessageişlemini ne zaman ve ne sıklıkla çağıracağınıza karar verir; bu da aktarım hızı üzerinde doğrudan kontrol sağlar.
SDK sınıfı
ApsaraMQ for RocketMQ Simple tüketicileri için tek bir SDK sınıfı sağlar: SimpleConsumer. Bu sınıf Lite konularından mesajları tüketemez.
SimpleConsumer örneği
// Consume normal messages with SimpleConsumer
ClientServiceProvider provider = ClientServiceProvider.loadService();
String topic = "<your-topic>";
FilterExpression filterExpression = new FilterExpression("<your-filter-tag>", FilterExpressionType.TAG);
SimpleConsumer simpleConsumer = provider.newSimpleConsumerBuilder()
// Set the consumer group
.setConsumerGroup("<your-consumer-group>")
// Set the access endpoint
.setClientConfiguration(ClientConfiguration.newBuilder().setEndpoints("<your-endpoint>").build())
// Bind the subscription
.setSubscriptionExpressions(Collections.singletonMap(topic, filterExpression))
.build();
try {
// Pull up to 10 messages, wait up to 30 seconds
List<MessageView> messageViewList = simpleConsumer.receive(10, Duration.ofSeconds(30));
messageViewList.forEach(messageView -> {
System.out.println(messageView);
// Acknowledge each message after successful processing
try {
simpleConsumer.ack(messageView);
} catch (ClientException e) {
e.printStackTrace();
}
});
} catch (ClientException e) {
// Handle failures such as throttling, then retry the receive call
e.printStackTrace();
}
En iyi uygulamalar
Push tüketicileri için işleme süresini kontrol edin
Mesaj işlemeyi zaman aşımı eşiği içinde tutun. Sık zaman aşımları gereksiz yeniden denemelere ve yinelenen mesajlara neden olur. Uygulamanız düzenli olarak uzun süren görevleri işliyorsa bir Simple consumer'a geçin ve uygun bir mesaj görünmezlik süresi ayarlayın.
LitePullConsumer'dan SimpleConsumer'a geçiş yapın
LitePullConsumer Apache RocketMQ 4.x Remoting SDK'da bir tüketici türüydü. 5.x gRPC SDK'da kaldırılmıştır ve Go, Java ve Python 5.x SDK'ları bu türü sağlamaz.
Daha önce çekme tabanlı tüketim için LitePullConsumer kullandıysanız 5.x SDK'ya yükselttikten sonra **SimpleConsumer** türüne geçiş yapın. SimpleConsumer aşağıdaki işlemleri sağlar:
ReceiveMessage: Talep üzerine sunucudan mesajları çeker.AckMessage: Başarılı tüketimi onaylar.ChangeInvisibleDuration: Yeniden deneme aralığını kontrol etmek için mesaj görünmezlik süresini değiştirir.
Go SDK'sında karşılık gelen yöntemler Receive ve Ack iken Java SDK'sında karşılık gelen yöntemler receive ve ack şeklindedir.