[英]What is best approach to share a utility class between multiple microservices?
[英]Which is better Implementation approach - Create multiple objects or use a Utility class
我正在開發一個吞吐量非常高的 REST 服務,它需要處理大規模(每秒幾千個請求)。 在嘗試實現一項功能時,我創建了一個具有所需功能的類。 它看起來像這樣 -
public class Sample {
private SampleObject sampleObject;
private SampleOther params;
public Sample(final SampleObject sampleObject) {
this.sampleObject = sampleObject;
}
public void process(){
...
this.params = someComputation();
this.processHelper();
...
}
private void processHelper(){
...
}
}
您可以假設還有其他一些功能。 現在必須為每個傳入的請求創建一個新的 Sample 實例,這意味着將創建很多對象。 我的同事建議最好將類實現為具有靜態方法的實用程序類,並且您可以傳入參數以避免創建如此多的對象。 基本上是這樣的 -
public class Sample {
public static void process(SampleObject sampleObject){
...
processHelper(someComputation());
...
}
private void processHelper(SomeOther params){
...
}
}
雖然兩種方法都做同樣的工作,但我覺得第一個設計更好。 但就性能和更好的資源利用率(需要更少的 GC 等)而言,似乎第二種方法更好。 我想聽聽關於在這種情況下應該做什么的不同意見。
如果你把所有的靜態方法都放在一個類中,那么它就變成了過程編程模型,這意味着這樣做你就失去了面向對象編程模型的所有特性。 我們通常將方法標記為靜態,當它的實現非常標准並且不會被其子類更改時。 對於業務方法,OOP 方法是可取的。
最大的堆/GC 成本不是每個請求對象的單個,而是在函數之間攜帶狀態的多個較小的對象(例如第二個示例中的Someother params
)。 同樣適用於字符串對象、盒裝數字對象等。
避免每個請求創建 1 個新對象只是減少 1 個堆/GC 對象,您的第一個示例似乎創建了 2 個這樣的外部對象(1 個Sample
和 1 個SampleObject
)。 除了由someComputation
創建的內部SampleOther
對象。
理想情況下,高速實現每個請求的分配為零,但是每個並行處理線程需要一個壽命更長的處理對象,每個這樣的對象都有空間用於請求參數和計算緩沖區。 然而,這種方法不太適合基於對象的運行時,如 Java 和 .NET,其中自然風格是將所有請求參數作為由網絡運行時分配的對象接收,優化潛力只是減少數量每個請求分配的更多對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.