開發與維運

開發與維運

Sentry(v20.12.1) K8S 雲原生架構探索,JavaScript 性能監控之採樣 Transactions

你可以通過兩種方式控制發送到 Sentry 的 transactions 的量。 Uniform Sample Rate 如果您希望 transactions 的 cross-section 均勻,無論您在應用程序中的何處或在什麼情況下發生,並且對下文所述的默認繼承和優先級行為感到滿意,設置統一採樣率都是一個不錯的選擇。 為此,請將 Sentry.init() 中的 tracesSampleRate 選項設置為 0 到

開發與維運

Podinfo,迷你的 Go 微服務模板

項目介紹 Podinfo 是一個用 Go 製作的小型 web 應用程序,它展示了在 Kubernetes 中運行微服務的最佳實踐。 它已實現的技術指標(截選自官方 README.md ): 裡面每一項技術指標的實現方式,其實都可以拿出來單獨講好久,相關理論也有好多。 這裡我只是講針對這個項目,我們該如何使用 Docker 去試玩它。 構建容器調試環境 IDE VSCode + golang/vscode-go

開發與維運

java多線程中sleep和wait的4個區別,你知道幾個?

一、sleep是線程方法,wait是Object方法 這個如何驗證呢?我們還需要到jdk源碼中看看。首先進入到Thread的源碼中看一下,然後俺ctrl+O就可以查看方法列表。在最上面可以搜尋,我們輸入“s”,就可以查看所有以s開頭的方法了。 我們會發現,slee方法真實的在Thread線程類中。下面我們以同樣的方法查看wait。 這是第一個區別很容易驗證,下面我們來看第二個。 二、sleep不釋放lock,wait會釋放 這個如何驗證呢?這就需要代碼了。先看我們的sleep方法 public class Test { private final static Object lock = new Object(); public static

開發與維運

Sentry(v20.12.1) K8S 雲原生架構探索,JavaScript Enriching Events(豐富事件信息)

Add Context 自定義上下文允許您將任意數據附加到事件。通常,此上下文在其生命週期中捕獲的任何 issue 之間都是共享的。您無法搜索這些,但可以在 issue 頁面上查看它們: Structured Context 附加自定義 data 的最佳實踐是通過結構化上下文。上下文必須始終是一個 dictionary 或 map,它的值可以是任意的。使用 setContext 並給 context 一個唯一的名稱: Sentry.setContext(“character”,

開發與維運

聊聊ClickHouse的開發、編譯和測試

ClickHouse為了一款性能極佳的開源OLAP數據庫,在最近幾年也是越來越火,除了在各大互聯網公司落地生根之外,也吸引了一大批熱心的貢獻者。 截止到v21.10版本,CH在全球一共有1064名contributor。 SELECT count(1) FROM system.contributors Query id: 7cdf54f1-cb50-45c0-99b9-14d73d283e39 ┌─count()─┐ │ 1064 │ └─────────┘ 而要給社區貢獻代碼,首先就要經歷一次完整的開發、編譯和測試過程,文本將總結上述流程中常用到的一些工具和技巧,希望對有志於貢獻CH代碼的同學能有所幫助。 開發 開發環境配置可參考以下文章 C++開發環境最佳實踐 vscode clangd

開發與維運

詳解java中的併發關鍵字volatile

一、為什麼要用到volatile關鍵字? 使用一個新技術的原因肯定是當前存在了很多問題,在Java多線程的開發中有三種特性:原子性、可見性和有序性。我們可以在這裡簡單的說一下: 1、原子性(Atomicity) 原子性是指在一個操作中就是cpu不可以在中途暫停然後再調度,既不被中斷操作,要不執行完成,要不就不執行,就好比你做一件事,要麼不做,要麼做完。java提供了很多機制來保證原子性。我們舉一個例子,比如說常見的a++就不滿足原子性。這個操作實際是a = a + 1;是可分割的。在運行的時候可能做了一半不做了。所以不滿足原子性。 為了解決上面a++出現的問題,java提供了很多其他的關鍵字和類,比如說AtomicInteger、AtomicLong、AtomicReference等。 2、可見性(Visibility) 可見性就是指當一個線程修改了線程共享變量的值,其它線程能夠立即得知這個修改。如果我們學過java內存模型的話,對下面這張圖想必不陌生: 每一個線程都有一份自己的本地內存,所有線程共用一份主內存。如果一個線程對主內存中的數據進行了修改,而此時另外一個線程不知道是否已經發生了修改,就說此時是不可見的。 這種不可見的狀況會帶來一個問題,兩個線程有可能會操作同一份但是值不一樣的數據。這時候怎麼辦呢?於是乎,今天的主角登場了,這就是volatile關鍵字。 volatile關鍵字的作用很簡單,就是一個線程在對主內存的某一份數據進行更改時,改完之後會立刻刷新到主內存。並且會強制讓緩存了該變量的線程中的數據清空,必須從主內存重新讀取最新數據。這樣一來就保證了可見性 3、有序性 程序執行的順序按照代碼的先後順序執行就叫做有序性,但是有時候程序的執行並不會遵循,比如說下面的代碼: int i = 1;

開發與維運

java併發編程中的CAS機制,你理解嘛?

一、為什麼需要CAS機制? 為什麼需要CAS機制呢?我們先從一個錯誤現象談起。我們經常使用volatile關鍵字修飾某一個變量,表明這個變量是全局共享的一個變量,同時具有了可見性和有序性。但是卻沒有原子性。比如說一個常見的操作a++。這個操作其實可以細分成三個步驟: (1)從內存中讀取a (2)對a進行加1操作 (3)將a的值重新寫入內存中 在單線程狀態下這個操作沒有一點問題,但是在多線程中就會出現各種各樣的問題了。因為可能一個線程對a進行了加1操作,還沒來得及寫入內存,其他的線程就讀取了舊值。造成了線程的不安全現象。如何去解決這個問題呢?最常見的方式就是使用AtomicInteger來修飾a。我們可以看一下代碼: public class Test3 { //使用AtomicInteger定義a static AtomicInteger a = new AtomicInteger(); public static void

開發與維運

詳解java併發原子類AtomicInteger(基於jdk1.8源碼分析)

一、從a++說起為什麼使用AtomicInteger 我們知道java併發機制中主要有三個特性需要我們去考慮,原子性、可見性和有序性。volatile關鍵字可以保證可見性和有序性卻無法保證原子性。而這個AtomicInteger的作用就是為了保證原子性。我們先看一個例子。 public class Test { //一個變量a private static volatile int a = 0; public static void main(String[] args) {

開發與維運

java併發原子類AtomicBoolean解析

一、為什麼使用AtomicBoolean? 我們平時一般都是使用的boolean來表示布爾變量,但是在多線程情況下boolean是非線程安全的。為什麼是非線程安全的呢?我們看下面的這個例子: private volatile Boolean flag = false; publich void test() { synchronized(flag) { //去做其他的事:訪問臨界資源 flag = !flag; } }

Scroll to Top