ARTS:
- Algorithm : 每週至少做一個 leetcode 的算法題
- Review: 閱讀並點評至少一篇英文技術文章
- Tip: 學習至少一個技術技巧、
- Share: 分享一篇有觀點和思考的技術文章。
Algorithm
編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 char[] 的形式給出。
不要給另外的數組分配額外的空間,你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。
你可以假設數組中的所有字符都是 ASCII 碼錶中的可打印字符。
- python 版
class Solution(object):
def reverseString(self, s):
time = len(s) / 2
for i in range(time):
s[i],s[len(s)-i-1] = s[len(s)-i-1],s[i]
- Java版
class Solution {
public void reverseString(char[] s) {
char temp = '\0';
for (int i = 0; i < s.length / 2; i++) {
temp = s[i];
s[i] = s[s.length - 1 - i];
s[s.length - 1 - i] = temp;
}
}
}
Review
《Pattern: Microservice Architecture》是系列文章《A pattern language for microservices》的第二篇,討論微服務的模式語言。
Pattern Language (模式語言) 是從建築學借鑑過來的思想,就像中文,英文爲日常交流提供共同語言一樣,模式語言爲特定場景,特定領域提供了討論問題的交流術語。模式語言主要目的是幫助開發者解決在設計和編程中遇到的共同的問題,即清晰的問題陳述、體現問題的解決方案以及推動解決方案的力量(Force)的清晰表述。
文章以一個虛擬電子商務應用爲背景(Context),列出問題和需求,進而提出微服務這種解決方案(solution),並且給出示例,關鍵是有代碼示例(example applications developed by Chris Richardson)。接着討論微服務的優點和缺點(不一一列出,網上寫微服務優缺點的文章不少,相信關注過微服務的同學也早有耳聞)。
我重點關注的是要實施微服務那些要解決的問題(Issue):
Issue 1: When to use the microservice architecture?
系統經過最初的野蠻生長階段,業務越來越複雜,需要考慮如何擴容,如何按業務功能拆分時就需要引進微服務了。
Later on, however, when the challenge is how to scale and you need to use functional decomposition, the tangled dependencies might make it difficult to decompose your monolithic application into a set of services.
Issue 2: How to decompose the application into services?
- 根據業務能力拆分
- 根據領域驅動設計拆分子域
- 根據“動詞”或者用例進行服務劃分。例如“發貨”服務(Shipping Service),“登錄”服務
- 根據“名詞”或者資源進行系統劃分。例如Account Service
Issue 3: How to maintain data consistency?
數據一致性是分佈式系統的一個Big Challenge。2PC或分佈式事務的方案(指的是強一致性方案)對許多應用來說是不被接受的。取而代之的是Saga模式。在Saga裏,一個服務的數據發生了變化,就會發佈一個事件。其他服務會消費這個事件並更新它們自己的數據。可見Saga是一種基於事件驅動的最終一致性模型。
Issue4: How to implement queries?
另一個挑戰是如何在跨服務中查詢數據。這裏提到了API組合模式(一般用API Gateway來實現這個組合的動作)和CQRS。
小結
該系列的其他文章就是對上述Issue解決方案的詳細討論,非常值得研讀,每篇文章篇幅都不長,可以作爲微服務入門級的讀物。並且最重要的是作者Chris Richardson提供了很多代碼示例(比如這個:Event-Sourcing+CQRS example application)。是研究DDD+EventSource+CQRS 非常好的材料。
Tip
小技巧:利用HC fluent API 優雅地使用Apache HttpClient