-
語言: 用了哪些開發語言,如:C++/Java/Go/PHP/Python/Ruby 等等;
-
元件:用了哪些元件,如:MQ 元件,資料庫元件等等;
-
流程:怎樣的流程和規範,如:開發流程,專案流程,釋出流程,監控告警流程,程式碼規範等等;
-
系統:系統化建設,上面的流程需要有系統來保證,如:規範釋出流程的釋出系統,程式碼管理系統等等;
-
Redmine: 用 Ruby 開發的,有較多的外掛可以使用,能自定義欄位,集成了專案管理,Bug 問題跟蹤,WIKI 等功能,不過好多外掛 N 年沒有更新了;
-
Phabricator:用 PHP 開發的,Facebook 之前的內部工具,開發這工具的哥們離職後自己搞了一個公司專門做這個軟體,集成了程式碼託管, Code Review,任務管理,檔案管理,問題跟蹤等功能,強烈推薦較敏捷的團隊使用;
-
Jira:用 Java 開發的,有使用者故事,task 拆分,燃盡圖等等,可以做專案管理,也可以應用於跨部門溝通場景,較強大;
-
悟空 CRM :這個不是專案管理,這個是客戶管理,之所以在這裡提出來,是因為在 To B 的創業公司裡面,往往是以客戶為核心來做事情的,可以將專案管理和問題跟進的在悟空 CRM 上面來做,他的開源版本已經基本實現了 CR< 的核心 功能,還帶有一個任務管理功能,用於問題跟進,不過用這個的話,還是需要另一個專案管理的軟體協助,順便說一嘴,這個系統的程式碼寫得很難維護,只能適用於客戶規模小(1萬以內)時。
-
阿裡萬網:阿裡 2014 年收購了萬網,整合了其域名服務,最終形成了現在的阿裡萬網,其中就包含 DNS 這塊的服務;
-
騰訊 DNSPod:騰訊 2012 年以 4000 萬收購 DNSPod 100% 股份,主要提供域名解析和一些防護功能;
-
支援四層協議請求(包括 TCP、UDP 協議);
-
支援七層協議請求(包括 HTTP、HTTPS 協議);
-
集中化的證書管理系統支援 HTTPS 協議;
-
健康檢查;
-
Dubbo:Dubbo 是阿裡巴巴公司開源的一個 Java 高效能優秀的服務框架,使得應用可透過高效能的 RPC 實現服務的輸出和輸入功能,可以和 Spring 框架無縫整合。當年在淘寶內部,Dubbo 由於跟淘寶另一個類似的框架 HSF 有競爭關係,導致 Dubbo 團隊解散,最近又活過來了,有專職同學投入。
-
DubboX:DubboX 是由噹噹在基於 Dubbo 框架擴充套件的一個 RPC 框架,支援 REST 風格的遠端呼叫、Kryo/FST 序列化,增加了一些新的feature。 Motan:Motan 是新浪微博開源的一個 Java 框架。它誕生的比較晚,起於 2013 年,2016 年 5 月開源。Motan 在微博平臺中已經廣泛應用,每天為數百個服務完成近千億次的呼叫。
-
rpcx:rpcx 是一個類似阿裡巴巴 Dubbo 和微博 Motan 的分散式的 RPC 服務框架,基於 Golang net/rpc 實現。但是 rpcx 基本只有一個人在維護,沒有完善的社群,使用前要慎重,之前做 Golang 的 RPC 選型時也有考慮這個,最終還是放棄了,選擇了 gRPC,如果想自己自研一個 RPC 框架,可以參考學習一下。
-
etcd,一個高可用、分散式、一致性、key-value 方式的儲存,被用在分享配置和服務發現中。兩個著名的專案使用了它:Kubernetes 和 Cloud Foundry。
-
Consul,一個發現和配置服務的工具,為客戶端註冊和發現服務提供了API,Consul還可以透過執行健康檢查決定服務的可用性。
-
Apache ZooKeeper,是一個廣泛使用、高效能的針對分散式應用的協調服務。Apache ZooKeeper 本來是 Hadoop 的子工程,現在已經是頂級工程了。
-
完整地支援 SQL,支援 JOIN / GROUP BY /子查詢等複雜 SQL 查詢。
-
支援傳統資料標配的 ACID 事務,支援強隔離級別。
-
具有彈性伸縮的能力,擴容縮容對於業務層完全透明。
-
真正的高可用,異地多活、故障恢復的過程不需要人為的接入,系統能夠自動地容災和進行強一致的資料恢復。
-
具備一定的大資料分析能力。
-
鍵值,適用於內容快取,適合混合工作負載併發高擴充套件要求大的資料集,其優點是簡單,查詢速度快,缺點是缺少結構化資料,常見的有 Redis,Memcache,BerkeleyDB 和 Voldemort 等等;
-
列式,以列簇式儲存,將同一列資料存在一起,常見於分散式的檔案系統,其中以 Hbase,Cassandra 為代表。Cassandra 多用於寫多讀少的場景,國內用得比較多的有 360,大概 1500 臺機器的叢集,國外大規模使用的公司比較多,如 eBay,Instagram,Apple 和沃爾瑪等等;
-
檔案,資料儲存方案非常適用承載大量不相關且結構差別很大的複雜資訊。效能介於 kv 和關係資料庫之間,它的靈感來於 lotus notes,常見的有 MongoDB,CouchDB 等等;
-
圖形,圖形資料庫擅長處理任何涉及關係的狀況。社交網路,推薦系統等。專註於構建關係圖譜,需要對整個圖做計算才能得出結果,不容易做分散式的叢集方案,常見的有 Neo4J,InfoGrid 等。
-
非同步處理:非同步處理是使用訊息中介軟體的一個主要原因,在工作中最常見的非同步場景有使用者註冊成功後需要傳送註冊成功郵件、快取過期時先傳回老的資料,然後非同步更新快取、非同步寫日誌等等;透過非同步處理,可以減少主流程的等待響應時間,讓非主流程或者非重要業務透過訊息中介軟體做集中的非同步處理。
-
系統解耦:比如在電商系統中,當使用者成功支付完成訂單後,需要將支付結果給通知ERP系統、發票系統、WMS、推薦系統、搜尋系統、風控系統等進行業務處理;這些業務處理不需要實時處理、不需要強一致,只需要最終一致性即可,因此可以透過訊息中介軟體進行系統解耦。透過這種系統解耦還可以應對未來不明確的系統需求。
-
削峰填谷:當系統遇到大流量時,監控圖上會看到一個一個的山峰樣的流量圖,透過使用訊息中介軟體將大流量的請求放入佇列,透過消費者程式將佇列中的處理請求慢慢消化,達到消峰填谷的效果。最典型的場景是秒殺系統,在電商的秒殺系統中下單服務往往會是系統的瓶頸,因為下單需要對庫存等做資料庫操作,需要保證強一致性,此時使用訊息中介軟體進行下單排隊和流控,讓下單服務慢慢把佇列中的單處理完,保護下單服務,以達到削峰填谷的作用。
-
安全和許可權管理,將程式碼放到內網並且對於關係公司命脈的核心程式碼做嚴格的程式碼控制和機器的物理隔離;
-
程式碼管理工具,Git 作為程式碼管理的不二之選,你值得擁有。GitLab 是當今最火的開源 Git 託管服務端,沒有之一,雖然有企業版,但是其社群版基本能滿足我們大部分需求,結合 Gerrit 做 Code review,基本就完美了。當然 GitLab 也有程式碼對比,但沒 Gerrit 直觀。Gerrit 比 GitLab 提供了更好的程式碼檢查介面與主線管理體驗,更適合在對程式碼質量有高要求的文化下使用。
-
Jenkins:Java 寫的有強大的外掛機制,MIT 協議開源 (免費,定製化程度高,它可以在多臺機器上進行分散式地構建和負載測試)。Jenkins 可以算是無所不能,基本沒有 Jenkins 做不了的,無論從小型團隊到大型團隊 Jenkins 都可以搞定。不過如果要大規模使用,還是需要有人力來學習和維護。
-
TeamCity:TeamCity 與 Jenkins 相比使用更加友好,也是一個高度可定製化的平臺。但是用的人多了,TeamCity就要收費了。
-
Strider:Strider 是一個開源的持續整合和部署平臺,使用 Node.js 實現,儲存使用的是 MongoDB,BSD 許可證,概念上類似 Travis 和Jenkins。
-
GitLab CI:從GitLab 8.0開始,GitLab CI 就已經整合在 GitLab,我們只要在專案中新增一個 .gitlab-ci.yml 檔案,然後新增一個 Runner,即可進行持續整合。並且 GitLab 與 Docker 有著非常好的相互協作的能力。免費版與付費版本不同可以參見這裡:https://about.gitlab.com/products/feature-comparison/。
-
Travis:Travis 和 GitHub 強關聯;閉原始碼使用 SaaS 還需考慮安全問題;不可定製;開源專案免費,其它收費。
-
Go:Go 是 ThoughtWorks 公司最新的 Cruise Control 的化身。除了 ThoughtWorks 提供的商業支援,Go 是免費的。它適用於 Windows,Mac 和各種 Linux 發行版。
-
ElasticSearch 是個開源分散式搜尋引擎,它的特點有:分散式,零配置,自動發現,索引自動分片,索引副本機制,RESTful 風格介面,多資料源,自動搜尋負載等。
-
Logstash 是一個完全開源的工具,它可以對你的日誌進行收集、分析,並將其儲存供以後使用。
-
Kibana 是一個開源和免費的工具,它可以為 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 介面,可以幫助彙總、分析和搜尋重要資料日誌。
-
Filebeat 已經完全替代了 Logstash-Forwarder 成為新一代的日誌採集器,同時鑒於它輕量、安全等特點,越來越多人開始使用它。
-
Flume 是一個分散式、可靠、和高可用的海量日誌採集、聚合和傳輸的日誌收集系統,支援在日誌系統中定製各類資料傳送方,用於收集資料;同時,Flume 提供對資料進行簡單處理,並寫到各種資料接受方(可定製)的能力。
-
Kafka 是由 Apache 軟體基金會開發的一個開源流處理平臺,由 Scala 和 Java 編寫。其本質上是一個“按照分散式事務日誌架構的大規模釋出/訂閱訊息佇列”,它以可水平擴充套件和高吞吐率而被廣泛使用。
-
Prometheus Server 主要負責資料採集和儲存,提供 PromQL 查詢語言的支援。Server 透過配置檔案、文字檔案、ZooKeeper、Consul、DNS SRV Lookup 等方式指定抓取標的。根據這些標的會,Server 定時去抓取 metrics 資料,每個抓取標的需要暴露一個 http 服務的介面給它定時抓取。
-
客戶端 SDK:官方提供的客戶端類庫有 Go、Java、Scala、Python、Ruby,其他還有很多第三方開發的類庫,支援 Nodejs、PHP、Erlang 等。
-
Push Gateway 支援臨時性 Job 主動推送指標的中間閘道器。
-
Exporter Exporter 是 Prometheus 的一類資料採集元件的總稱。它負責從標的處蒐集資料,並將其轉化為 Prometheus 支援的格式。與傳統的資料採集元件不同的是,它並不向中央伺服器傳送資料,而是等待中央伺服器主動前來抓取。Prometheus 提供多種型別的 Exporter 用於採集各種不同服務的執行狀態。目前支援的有資料庫、硬體、訊息中介軟體、儲存系統、HTTP 伺服器、JMX 等。
-
Alertmanager:是一個單獨的服務,可以支援 Prometheus 的查詢陳述句,提供十分靈活的報警方式。
-
Prometheus HTTP API 的查詢方式,自定義所需要的輸出。
-
Grafana 是一套開源的分析監視平臺,支援 Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch 等資料源,其 UI 非常漂亮且高度定製化。
-
基於 zk 和 etcd,支援介面和 api ,用資料庫來儲存版本歷史,預案,走審核流程,最後下發到 zk 或 etcd 這種有推送能力的儲存裡(服務註冊本身也是用 zk 或 etcd,選型就一塊了)。客戶端都直接和 zk 或 etcd 打交道。至於灰度釋出,各家不同,有一種實現是同時釋出一個需要灰度的 IP 串列,客戶端監聽到配置節點變化時,對比一下自己是否屬於該串列。PHP 這種無狀態的語言和其他 zk/etcd 不支援的語言,只好自己在客戶端的機器上起一個 Agent 來監聽變化,再寫到配置檔案或共享記憶體,如 360 的 Qconf。
-
基於運維自動化的配置檔案的推送,審核流程,配置資料管理和方案一類似,下發時生成配置檔案,基於運維自動化工具如 Puppet,Ansible 推送到每個客戶端,而應用則定時重新讀取這個外部的配置檔案,灰度釋出在下發配置時指定IP串列。
-
從程式碼(Code)到成品庫(Artifact)這個階段主要對開發人員的程式碼做持續構建並把構建產生的製品集中管理,是為部署系統準備輸入內容的階段。
-
從製品到可執行服務 這個階段主要完成製品部署到指定環境,是部署系統的最基本工作內容。
-
從開發環境到最終生產環境 這個階段主要完成一次變更在不同環境的遷移,是部署系統上線最終服務的核心能力。
-
是否簡單,是否需要每臺機器部署 Agent(客戶端)
-
語言的選擇(Puppet/Chef vs Ansible/SaltStack )開源技術,不看官網不足以熟練,不懂原始碼不足以精通;Puppet、Chef 基於 Ruby 開發,Ansible、SaltStack 基於 Python 開發的
-
速度的選擇(Ansible vs SaltStack)Ansible 基於 SSH 協議傳輸資料,SaltStack 使用訊息佇列 zeroMQ 傳輸資料;大規模併發的能力對於幾十臺-200 臺規模的兄弟來講,Ansible的效能也可接受,如果一次操作上千臺,用 salt 好一些。
-
選擇團隊熟悉的/能掌控的,創業公司人少事多,無太多冗餘讓研發團隊熟悉新的語言,能快速上手,能快速出活,出了問題能快速解決的問題的語言才是好的選擇。
-
選擇更現代一些的,這裡的現代是指語言本身已經完成一些之前需要特殊處理的特性,比如記憶體管理,執行緒等等。
-
選擇開源輪子多的或者社群活躍度高的,這個原則是為了保證在開發過程中減少投入,有穩定可靠的輪子可以使用,遇到問題可以在網上快速搜尋到答案。
-
選擇好招人的 一門合適的語言會讓創業團隊減少招聘的成本,快速招到合適的人。
-
選擇能讓人有興趣的 與上面一點相關,讓人感興趣,在後面留人時有用。
-
選擇靠譜的雲服務商;
-
選擇雲服務商的元件;
-
選擇成熟的開源元件,而不是最新出的元件;
-
選擇採用在一線網際網路公司落地並且開源的,且在社群內形成良好口碑的產品;
-
開源社群活躍度;
-
制定開發的規範,程式碼及程式碼分支管理規範,關鍵性程式碼僅少數人有許可權;
-
制定釋出流程規範,從釋出系統落地;
-
制定運維規範;
-
制定資料庫操作規範,收攏資料庫操作許可權;
-
制定告警處理流程,做到告警有人看有人處理;
-
制定彙報機制,晨會/周報;
朋友會在“發現-看一看”看到你“在看”的內容