多執行緒程式的效能隱形殺手 - False sharing
多執行緒碰上多核心
由於現在的CPU都是多核心,為了充份利用CPU的運算能力,開發多執行緒的程式就成為一件很合理的事情,而且.Net framework在4.0開始對平行運算提供了愈來愈完整的支援,開發多執行緒的程式跑在多核心的主機這件事,也變的愈來愈簡單。
但在某些場景,使用多執行緒運算並不見得會提昇運算效率,不正確的使用多執行緒運算甚至會拖慢系統效能。
Disruptor.Net - IEventTranslator
IEventTranslator
IEventTranslator是在第3版發布的新功能,這篇文章是介紹使用的方式及設計理念
生產者發送事件到RingBuffer
事件驅動的一個特性就是透過發送事件給關注的訂閱者,進而讓多個不同的業務邏輯得以實現,以Disruptor的設計,就是要透過RingBuffer.Publish()
這個方法把事件放入RingBuffer,後面的EventHandler則會依據其掛載的順序,由SequenceBarrier
調度執行。
Redis系列 - C#存取Redis (下)
C#存取Redis - Timeout trouble shooting
這一篇是討論Timeout trouble shooting為主,有一些基礎知識不再贅述,請參考本人之前的文章。
Redis系列 - C#存取Redis (中)
C#存取Redis
延續上一篇Redis系列 - C#存取Redis (上),這篇文章會說明Redis的簡易Publish/Subscribe、Lua script的基礎知識。
PUBLISH/SUBSCRIBE
Redis的PUB/SUB是很簡易的訊息機制,並不像一些專門的Message Middleware(例如RabbitMQ、ActiveMQ)提供很多豐富的功能,比如它就不保證訊息發送後一定不會遺失,但因為附帶的這個功能實在太方便了,實務上還是經常使用到。
Redis系列 - C#存取Redis (上)
C#存取Redis
這篇算是Redis系列第二篇,內容會儘量涵蓋存取Redis需要注意的一些基本知識及除錯
Redis的特性
在Redis系列第一篇有提到Redis是一個效能極好且穩定性很高的In-Memory的NoSQL database,它有幾個特性是我們需要知道的:
- 以ANSI C開發,穩定
- 資料儲存在Memory中處理,減少了Disk I/O
- Single Thread I/O Multiplex
- 提供AOF/RDB 2種持久化方式
如何開始架構設計
需求決定架構
一開始就直接破題了,軟體架構不是看著國內外大神分享的架構簡報抄一遍就好,也不是完全靠經驗決定架構怎麼設計。
所有的架構設計都是由需求決定,我指的需求不單單指需求規格書上的功能性需求(Funtional Requirements)
,還包括了很容易被忽視的非功能性需求(Non-Functional Requirements)
與約束(Constraints)
。
Redis系列 - 環境建置篇
Redis系列 - 環境建置篇
這篇會是Redis系列文的第一篇,著重在建立環境的基本知識。
基本介紹
以官方的解釋,Redis是一套Open source的In-memory NoSQL database,可以應用在Cache、Database及簡單的Message broker。
作者則說它是一個Data Structures Server
,顧名思義,它提供了很多種資料結構及相對應的指令去操作這些資料。由於它是以In-Memory的方式為主,另一個很明顯的特性就是它很快,非常快,正確使用下可以輕鬆的處理每秒上萬的請求。
由於它具備極高的效能與可靠性,在很多系統中都會看到它的身影,對Backend/Fullstack engineer來說,這已經是必備的技能之一。