SOFAStack 消息隊列提供三種方式來發送普通消息:同步發送、異步發送和單向(Oneway)發送。本文介紹了每種發送方式的原理、使用場景、示例代碼,以及三種發送方式的對比。
三種發送方式的對比
三者的特點和主要區別如下:
發送方式 | 發送 TPS | 發送結果反饋 | 可靠性 | 適用場景 |
同步發送 | 快 | 有 | 不丟失 | 此種方式應用場景非常廣泛,例如重要通知郵件、報名短信通知、營銷短信系統等。 |
異步發送 | 快 | 有 | 不丟失 | 異步發送一般用于鏈路耗時較長,對響應時間較為敏感的業務場景,例如用戶視頻上傳后通知啟動轉碼服務,轉碼完成后通知推送轉碼結果等。 |
單向發送 | 最快 | 無 | 可能丟失 | 適用于某些耗時非常短,但對可靠性要求并不高的場景,例如日志收集。 |
同步發送
原理
同步發送是指消息發送方發出一條消息后,會在收到服務端返回響應之后才發下一條消息的通訊方式。
示例代碼
import java.util.Properties;
import com.alipay.sofa.sofamq.client.PropertyKeyConst;
import io.openmessaging.api.OMS;
import io.openmessaging.api.Producer;
import io.openmessaging.api.SendResult;
public class SomeClass {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty(PropertyKeyConst.GROUP_ID, "GID_XXX");
Producer producer = OMS.builder().driver("sofamq").endpoint("$END_POINT")
.build().createProducer(properties);
producer.start();
String msgBody = "Message Body";
Message message = new Message("YOUR_TOPIC","$YOUR_TAGS", msgBody.getBytes());
SendResult sendResult = producer.send(message);
System.out.println(sendResult);
}
}
異步發送
原理
異步發送是指發送方發出一條消息后,不等服務端返回響應,接著發送下一條消息的通訊方式。消息隊列的異步發送,需要用戶實現異步發送回調接口(SendCallback)。消息發送方在發送了一條消息后,不需要等待服務端響應即可發送第二條消息。發送方通過回調接口接收服務端響應,并處理響應結果。
示例代碼
import java.util.Properties;
import com.alipay.sofa.sofamq.client.PropertyKeyConst;
import io.openmessaging.api.OMS;
import io.openmessaging.api.OnExceptionContext;
import io.openmessaging.api.Producer;
import io.openmessaging.api.SendCallback;
import io.openmessaging.api.SendResult;
public class SomeClass {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty(PropertyKeyConst.GROUP_ID, "GID_XXX");
Producer producer = OMS.builder().driver("sofamq").endpoint("$END_POINT")
.build().createProducer(properties);
producer.start();
String msgBody = "Message Body";
Message message = new Message("YOUR_TOPIC","$YOUR_TAGS", msgBody.getBytes());
producer.sendAsync(message, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("send success: " + sendResult);
}
@Override
public void onException(OnExceptionContext context) {
System.out.println("send fail: " + context);
}
});
}
}
單向(Oneway)發送
原理
發送方只負責發送消息,不等待服務端返回響應且沒有回調函數觸發,即只發送請求不等待應答。此方式發送消息的過程耗時非常短,一般在微秒級別。
示例代碼
import java.util.Properties;
import com.alipay.sofa.sofamq.client.PropertyKeyConst;
import io.openmessaging.api.OMS;
import io.openmessaging.api.Producer;
public class SomeClass {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty(PropertyKeyConst.GROUP_ID, "GID_XXX");
Producer producer = OMS.builder().driver("sofamq").endpoint("$END_POINT")
.build().createProducer(properties);
producer.start();
String msgBody = "Message Body";
Message message = new Message("YOUR_TOPIC","$YOUR_TAGS", msgBody.getBytes());
producer.sendOneway(message);
}
}
文檔內容是否對您有幫助?