我正在實作 Spring Boot App,它從 kafka 讀取一些資料,為所有請求的客戶端提供它。假設我有以下課程:
@Component
public class DataProvider {
private Prices prices;
public DataProvider() {
this.prices = Prices.of();
}
public Prices getPrices() {
return prices;
}
}
每個客戶都可以執行GET /api/prices以獲取有關最新價格的資訊。來自 kafka 的價格實時更新。由于該更新每 5 秒進行一次,這并不常見,因此該主題只有一個磁區。
我嘗試了使用 Kafka Listener 的非常基本的選項:
@Component
public class DataProvider {
private Prices prices;
public DataProvider() {
this.prices = Prices.of();
}
public Prices getPrices() {
return prices;
}
@KafkaListener(topics = "test-topic")
public void consume(String message) {
Prices prices = Prices.of(message);
this.prices = prices;
}
}
這種方法安全嗎?
uj5u.com熱心網友回復:
prices必須volatile是。但同樣:您需要確保價格的實際資料可以分散。一個 HTTP 請求可能回傳一個資料,但另一個并發可能回傳另一個。只是因為它剛剛被 Kafka 消費者更新。
你可能有你的consume()和getPrices()作為synchronized。因此,每個人都將在同一時刻獲得實際資料。但是它們不會是并行的,因為synchronized確保只有一個執行緒可以訪問物件。
保持一致性的另一種方法是查看ReadWriteLock障礙。因此,getPrices()呼叫可以是并行的,但只要 consume()需要 a WriteLock,每個人都會被阻塞,直到完成。
因此,從技術上講,您的代碼確實是安全的。只有在商業目的安全時才會出現問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/531728.html
