程式設計週記[2016/03/11]: 要會寫分散式系統,得先找到溝通的方法

這是什麼?

程式週記主要內容如下:

Gihub project 介紹:

  • 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢

網路文章心得:

  • 會寫些心得,強迫自己閱讀.

“程式週記”並且定期週期性更新.

大部分內容在我的twitter都會有,這邊只是將一些簡單的心得與感想註解一下.

本週摘要

本週花太時間在追如何使用etcd/raft.本來是打算用NSQ的管理方式,但是看了許久還是找不到他使用的方式.回過頭來使用raft

Go

writ: A flexible command and option parser for Go

  • 有點像是cobra,不過可以直接透過name tag 直接讓go structure 直接套入command option.

A command line client for Dropbox built using the Go SDK

kati: Google GNU make clone which is written by golang

  • 可以透過kati來將makefile轉換成ninja用的檔案.

A repository for plotting and visualizing data

  • 可以拿來換圖用的套件.

Stochastic flame graph profiler for Go programs

  • 隨機產生火焰顯示profile你的go程式的結果.

Python

Android/JAVA/NODE.JS

Building Android Apps — 30 things that experience made me learn the hard way — Medium

  • 作者分享在開發Android App裡面踩到的雷,這種經驗分享的文章,永遠都是我的最愛.

Yahoo Deep Learning Engine: CaffeOnSpark

  • Yahoo最近開源的Deep Learning Engine,主要可以將Hadoop/Spark Cluster的資料抓取來使用.更多部分可以看他們的文章

Cross-platform Linux without the suck

  • 可以讓你在Windows下面使用unix的console,而且又不像Cygwin那麼大.重點是用JS ES6寫的

Docker

Kafka (and Zookeeper) in Docker

  • Spotify 開源docker image可以讓你快速架設kafka跟zookeeper.

One+ year feedback of using Docker and Swarm in DEV and QA environments — Medium

  • 使用swarm經驗談文章.. 挺不錯的. 有教導如何透過swarm在dev <-> pre-prod <-> prod 之間切換的方法.

iOS/Swift

網站文章

Use CloudFlare to enable HTTPS on your Github Page hosted blog

  • 如果你有使用Github page 去Hosted 你的 blog,這邊可以幫你加上HTTPS (SSL).如果是限制的連線數下,是免費的服務.
  • 這邊有另外一篇文章也提到,不過他建議如果有用到custom domain name記得要把name server轉址.
  • 這篇文章更提到其實本身的github.io已經有https,只是在CNAME支援上有些問題.如果再不使用CNAME狀況下,是可以直接跑的.有一些相關的設定可以幫助你更輕鬆使用.

How and when Ken Thompson started programming? Also, Ken Thompson [wa|i]s in reddit.

  • 來看看C語言與Go語言的共同發明人 Ken Thompson 的小故事

一个有趣的实例让NoSQL注入不再神秘

  • MongoDB可以透過網頁輸入NoSQL查詢語法,所以有漏洞因此而生.

AWS最新白皮書PDF下載”Building a Real-Time Bidding Platform on AWS”

Use CloudFlare to enable HTTPS on your Github Page hosted blog

  • Github Page (ex: https://kkdai.github.io) 本身其實有HTTPS(SSL)的服務,不過如果你透過Custom Domain轉過來的話就會失效.這時候的方式就是透過CloudFlare來當CDN提供SSL的服務.

網站收集

有聲書/影片心得

本週專案

這邊會寫一些我的Project 52的成果.

本週專案: https://github.com/kkdai/raftrpc

本週繼續上週不敢挑戰的consensus,在還沒搞懂NSQ如何做的方式.

決定拿etcd的Raft來架設RPC Server.

本來想透過這篇文章來達成,不過context無法serialized.

回過頭去看etcd的raftexample,主要的重點是 raft需要另外一個http port 來架transport channel 來達到raft node 狀態交換.

如何導入raft到你的Project?

  1. Refer code from raftexample
  2. Get file listener.go, kvstore.go, raft.go.
  3. Do your modification for your usage.
note
  • raft.transport need an extra http port for raft message exchange. MUST add this in your code. (which is peer info in example code)

[TIL] Today I Learn 2016/03/10

Run docker container as default system services

  1. Start docker daemon when ubuntu launch.
  2. Add conf on service as follow
description "cAdvisor"

start on filesystem and started docker
stop on runlevel [!2345]

#respawn

# @see https://github.com/google/cadvisor/blob/master/docs/running.md#standalone
script

    docker rm -f cadvisor  || true

    docker run  \
        --volume=/:/rootfs:ro          \
        --volume=/var/run:/var/run:rw  \
        --volume=/sys:/sys:ro          \
        --volume=/var/lib/docker/:/var/lib/docker:ro  \
        --publish=8080:8080  \
        --detach=true    \
        --restart=always \
        --name=cadvisor  \
        google/cadvisor:latest

end script

For more detail, check here. Automatically start containers

[TIL] 2016/03/08

ETCD Architecture study.

Some study note about survey how Raft work in ETCD. Something more about official architecture from digging code.

  • Data storage in etcd/storage/backend. The file structure as follow:
    • topic/sub_topic/data
  • Data Exchange type using protobuf with grpc

BTW: NSQ using http.handle. So, no RPC data exchange issue, no protobuf required.

NSQ about how to elimiate SPOF

Refer to slide.

Seems the SPOF means of client side failure handle, not server side. (TBC)

  • Every server response to dedicate topic (no redudent) (p.22)
  • Client use this to add more consumer and handle it as load balance. (Refer topology_pattern)
    • quote: Assuming you have some sort of load balancer in front of these two hosts you can now tolerate any single host failure.

Need more check about this gist about use NSQ on K8s

[TIL] 2016/03/06 Today I learn from (Go/VC)

Golang

Program to prints out the visible surface of a go package?

Godex is the program to print APIs and package Info.

How to use godex

go get golang.org/x/tools/cmd/godex

How to use godex

godex math

godex github.com/kkdai/photomgr

VC(Visual Studido

How To Use RPC Callback Functions

IBM KM: RPC Callback Procedures Example

程式設計週記[2016/03/04]: 猴年開始:買了一堆電腦原文書,要開始K書

這是什麼?

程式週記主要內容如下:

Gihub project 介紹:

  • 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢

網路文章心得:

  • 會寫些心得,強迫自己閱讀.

“程式週記”並且定期週期性更新.

大部分內容在我的twitter都會有,這邊只是將一些簡單的心得與感想註解一下.

本週摘要

最近有在歐萊禮買了一本電子書,也找了不少有趣的電子書要看.得花更多時間來看,也想花點時間來看Coursera,時間真的要好好想想.

本週專案部分,最近實在花太多時間在看NSQ的內部構造.反而比較少花時間去寫Code.這其中的取捨變得困難不少,可能也跟我了解得不夠紮實有關.這部分要努力學習.

Go

A complete, reliable, ircd written in Go.

  • 用 go 寫的 ircd

xo is a command line tool to generate Go code based on a PostgreSQL, MySQL, SQLite, or Oracle, or Microsoft SQL Server database

  • 只要給SQL的Schema,就可以長出Golang的model

Youtube: Comparing Erlang and Go Concurrency

  • 可以參考看看一個session介紹關於Erlang跟Go的Concurrency.

licenses lists Go packages dependencies licenses

  • 可以列出所有用到的Go project的License,算是很有用的工具.

    [Go projects and the BSD license

    ](http://misfra.me/2016/02/28/go-projects-bsd-license/)

  • 從來沒有仔細思考過Go project 的license,只是簡單的把自己的專案都用MIT.看完才知道其中的關連…

One HTTP Request From Stardom: How Alan Shreve Built ngrok Using Go

  • ngrok是一個可以讓你在防火牆內部的Server可以直接被存取的技術,這邊介紹如何透過Go來build ngrok.

Python

Android/JAVA/NODE.JS

Pretty unicode tables for the CLI with Node.JS

  • 可以畫出很漂亮的unicode table在console mode.

Docker

iOS/Swift

奇点机智,用深度链接让 app 不再孤单

  • Deep Link 在iOS9獲得了不少的加強功能,而在App的設計上其實Deep Link 已經佔有一定的地位.這邊有談到說一家公司奇点机智如何透過幫忙控制Deep Link來讓App更好而且更多人使用.

Swift @ LinkedIn

  • LinkedIn裡面透過Swift開發的經驗,巔峰的時候有50人工程師參與開發.透過Swift開發App最大的瓶頸還是開發機器的能力.灣區日報有很精彩的評論

網站文章

學術論文解放!將近五萬篇論文可透過Sci-Hub免費下載

  • 當初Aaron Swartz 因從JSTOR 的學術期刊下載約400萬篇文章被停的Sci-Hub復活了.超過五萬篇論文可以下載.

Github: January 28th Incident Report

  • 引用: IngramChen from kaif:
    • Github 內部發生了類似 不小心踢掉電源線 這種意外,然後 25% 的 server reboot,reboot 過程中 redis cluster 爛掉,造成 application server 啟動失敗。他們無奈只好先救 redis cluster,直到 redis 救好後,才重啟 application server… 看完後覺得 Github engineer 實在有點遜,這種 failure 不該是這麼強的公司該犯的… 一個子系統失效了,就造成 application server 完全不能啟動 (平常完全沒有模擬過這類型的失常)。然後子系統失效的原因是電源異常,這表示他們只用一個 Data center 囉?電源一斷就 1/4 server reboot… 有點遜。 我不是說我能做的比他們好,但 Github 已經不是 startup,也能吸收到世界最頂尖的開發者,這種等級的錯誤不是他們該犯的…

如何投资自己?

  • 這一篇跟我最近在看的書籍Soft Skills後面的章節很類似.基本上就是討論如何訂定目標而努力學習的部分.書籍讀書心得會再出來.

網站收集

搜集一堆China 技術團隊使用Github issue當作blog

Interview with Jay Kreps about Apache Kafka

  • 採訪了Kafka的其中一個創始者-Jay Kreps 不僅僅有談到Kafka的設計理念,也有談到如果對分散式系統有興趣的人該如何開始了解. 裡面有不少有用的鏈結跟書籍推薦

APP 美工大捕帖

  • 要各種APP美工圖案可以來這裡看看.

Code School特惠

  • 線上學習網站 Code School 在2016/3/5 AM 6:00 到 2016/3/7PM 1:00 兩天半的時間內,開放全站所有課程都可以「免費」學習,只要累積分數在前 10 名者,還可以獲得額外一整年的免費學習帳號

“Software Engineering Radio”

  • Scott Tsai推薦的這個podcast真的不賴,很值得投資時間來聽聽.

有聲書/影片心得

IT公論: #190-给建筑师用的 GitHub

  • 這次請來了兩個建築師,一個是 Modelo 的創辦人Qi Su跟一個建築師事務所的黄璟璐.主要是來講解身為建築業使用的github:Modelo 的創業由來與其中設計的理念.
  • Modelo (http://modelo.io/)提供了一個可以讓建築師可以線上透過WebGL的Rendering方式來即時查看整個3D設計的方式.本來是在哈佛設計學院(Graduate School of Design (GSD))的一個畢業論文.由於在學時間這個論文得了不少獎,於是Qi Su就把它當創一個新創產業來建立了Modelo.
  • 透過這段談話,可以了解兩個產業間的用語不同與建築業界在意的事情.建築師們在意的是如何能夠快速地展現他的設計產品,並且能夠快速地得到反饋.根據得到的反饋能夠有儲存每個版本修訂間的變更,交互下能得到最大的效益.進而達到Modelo 的設計概念 Pain Less, Design More.

Paxos 發明者 Leslie Lamport 的採訪的 Podcast

Scale with NSQ: a realtime distributed messaging platform

  • 一些基本介紹關於NSQ如何scale與處理.

本週專案

這邊會寫一些我的Project 52的成果.

本週專案: https://github.com/kkdai/rd

本來是想過透過RabbitMQ的RPC方式來實現,不過這樣實在不是很像RPC,而且這樣分隔也無法把Message Queue本身做得更加的泛用.

只好先試著做出一個簡單版的RPC Message Queue Server,不過這樣設計上就更加的狹隘.

基礎架構是把Diskqueue所建置的Pubsub機制弄在RPC Server上面.發現無法使用Channel來達到訊息的流通,於是只能做了一個Consume也就是會把目前該topic 的所有訊息拉下來,並且清除掉.在這個狀態上,這個RPC Server必須要有格外的loop來處理Pubsub的結果.

Paxos 發明者 Leslie Lamport 的採訪的 Podcast

線上收聽的鏈結

起源:

最近有在聽Podcast的習慣,加上我一直有學習分散式系統的部分(尤其是Paxos跟Raft).於是試著上去iTune來搜尋,竟然有找到Paxos作者Leslie Lamport受訪的podcast.

為何會做Paxos

裡面相當的有趣,除了有講到當初會做Paxos是因為一開始Lamport在做他的Time Clock論文的時候,正個論文的架構是在討論如何避免失敗.但是一個有趣的問題來了,如果真正的遇到失敗要如何去恢復與處理.當初在研究Time Clock也是主要專注在分散式資料庫的方面,但是Lamport發現其實可以適用到任何的分散式系統,於是就慢慢演化成Paxos.

Paxos發表經過

就如大家所熟知的,由於Lamport在當時相當喜歡透過哲學的方式來敘述事情.也就是大家所熟知的Paxos議會故事,以至於Paxos論文一出來,大家完全看不懂也就不注意,就這樣被擱置了好幾年(據說十年).根據Lamport說,他認識的人也只有一個人聽得懂Paxos並且有幫助他宣傳,所以他又出了另外一篇廣為人知的Paxos Make Simple

最近的談話”Thinging For Programmer”

後來主持人又跟Lamport提到2014在MSFT Build “Thinking For Programmers的演說.裡面重要的概念就是每個程式設計師應該要先將你要寫的系統在腦中整個思考過,這邊講的思考建議是透過數學的方式來思考,因為這樣是最嚴謹的.透過嚴謹的思考,才能夠將整個系統的瓶頸跟問題找出來並且可以再發現之前來解決.

Lamport也提出一個範例,假設你要寫一個排序的程式.如果你沒有仔細思考要用哪種排序的方式而使用了Bubble Sort,不論你使用哪種程式語言,你使用哪種framework,你所建置的系統都不會快.因為他有先天性的限制,侷限了你的最佳速度,而這個是透過程式語言本身無法解決的.所以Lamport建議我們應該要先專注於”How should you do” 而不是 “What should you do”. 這邊提的”How” 代表你要用哪些方式,使用哪些演算法來解決問題. “What”才是你要用哪些語言來實現它.

最後也有提到UML或是透過繪圖方式來思考,不是不好.但是Lamport認為那些方式不容易清楚(precisely)而嚴謹的描述,容易造成混淆的區域.這樣就無法清楚的表達而思考整個系統的來龍去脈.

主持人提到會不會有人數學不好.而改用繪圖來思考? Lamport認為身為程式設計師,要清楚的頭腦來思考是絕對的重要.而透過清楚而精準的表達方式來呈現自己的思考脈絡更是一個程式設計師基本的學習.他很建議使用數學得方式來表達.

心得

想不到Leslie Lamport接受訪問的時候用字遣詞很容易了解.讓我們可以很了解這位大師的整個思考脈絡.這篇採訪實在相當的精彩,不論對於思考問題與解決問題的方法論.都有相當的建議.

相關鏈結