Showing posts with label python. Show all posts
Showing posts with label python. Show all posts

2015/06/01

打造微服務

剛開始並沒有預期是使用微服務。

在不斷調整的過程, 以及閱讀他人的想法後, 瞭解自己所處的位置。

推敲起來, 像是在一個只有筷子的用餐環境下, 自然會去使用。雖然不是刻意, 終究殊途同歸的結果。

主題是替某個研究單位打造內部資訊系統, 將目標和資源透明化的專案管理工具。

開始打工, 指定 M 社的 CMS 方案

團隊成立, 有不少角色, 大家都在熟悉中。
照傳統的方式進行訪談, 分析, 設計, 實作, …
光是資料表就討論大半年, 畢竟這是全部的人都認識, 總能談上兩句。

在 M 社工具(SD/IP/SM/VS四樣)加持, 歷經一番波折後完成。
工具多, 卻有各自的假設。在預給情境下, 拖拉點貼就解決。
然而, 經常面對的是一堵堵高牆, 愉快的滑鼠生涯了結, 開始耕碼長征之路。
在 API 叢林穿梭; 也在系統間徘徊。
幸好有許多第三方元件支持, 第一版得以面世。

棘手的問題在於, 冗長的開發到結果, 是一大包(monolith)。
縱使 M 社兵多將廣, 面對複雜的環境, 提供更多工具, 卻更令人左支右絀, 疲於奔命。即使變更一小處字樣, 從修改到配置, 不僅耗工夫, 也費時間。

如果偏好階級化流程, 有一大撮團隊, 絕對可讓大家都很忙, 每個人都有事情做。


因地制宜, 替系統加一層殼(Shell)

當時領域探索的人多, 需求也多; 然而隨時間推衍, 變化也多。
按官方手法實作, 必定成為瓶頸。

為了將 需求實作 的距離拉近, 借鏡 Unix, 在應用系統上加一層 Shell。作業系統的 Shell 通常是一個互動環境, 但在應用系統有不同呈現方式。例如要修改已有的網頁, 用 jQuery 一般比手工刻 JaveScript 好。存取複雜的資料, 透過 ORM 常不如 SQL 直接。而以框架為底、API/程式庫為輔、使用工具打造的應用, 也的敵不過腳本(Script)靈活。

這個案例是有工具負責資料綱目, 流程/表單, 並用 C# 做擴充。

最後維持資料綱目, 保留表單, 改為事件驅動(Event driven), 基本上利用 Powershell Script 在表單變化時更新資料庫, 同時擔任流程處理與擴充功能的任務。 對使用者的結果不變, 但流程的反應較好(原本頓頓的); 擺脫工具大包的束縛, 更快滿足需求。

從結果來看, 這個技巧是讓需求到方案的流動, 透過新搭建的 Shell, 約 80% 可快速流過; 縱使還有 20% 得經傳統工具, 由於毋需經常打交道, 阻礙自然較低。



持續開發, 逐步擴展, 遞加服務

完成第二階段, 系統表現稱職, 跑出新題目 … 建立 TLD 服務。兩個子系統 bind/whois 包含 server 和 DB 在 Linux, 使用者介面被期望繼續在 M 社的 SP 上。一般性應用的開發, 會將 DB 連線拉到 SP, 解決跨系統、跨設備的問題。但我們以系統安全的角度, 選擇用訊息傳遞(messaging)來解決, 順勢引入 python 的網路服務引擎 twisted

隨著系統擴展, 在 2014 的某個階段, 決定後端服務皆用 twisted。

這個決定點在於, 綜使之前做了簡化, 但開發的元件散落在各子系統上。加上原廠的方案, 檔案幾乎都是 binary 或是一大串, 版本控管有麻煩, 再在使變更困難或成本驟增。

所以把在各子系統做的, 除 UI, 權限管理外, 將通訊處理(protocol)、編組/解組(marshalling / unmarshalling)、資料存取、子系統溝通(REST 或 Web Services) … 分層(layered)後做成 twisted 的服務, 全部處理都訊息化, 包含檔案上/下傳。

這些順勢做的改變, 後來對照 microserivces 的要件, 很多地方相似, 甚至一致。

最明顯的好處是在面對人力多樣化, 經歷過: 原班的開發人員, 甲方組織的員工, 以及最後加入的外包單位。自己組員問題少, 甲方組織要投入前, 備妥環境著實不易, 後來用簡化的虛擬機器(做成 VM), 讓人入手。 到了外包單位加入, 已經有新的架構, 只要把 python 環境建立(難度大概只有 1/20 吧?), 加上源碼儲存庫, 按著符合情境腳本(Scenario)的 nose 測試碼, 就可開拓新的道路。不論開源工具帶來的好處, 新的方式讓開發者在特定區塊(Bounded context)就可完工, 是差異所在。

按照目前狀況, 應用系統想組合/分散功能, 更換子系統, 包含資料庫與文件管理(DMS), 甚至作業系統(docker?), 都變成策略面的考量, 不會因為技術造成障礙, 或讓開發好的應用鎖在某個地方。嗯, 是鎖在 python 上沒錯, 不過還有幾個選擇 …。

(待續)

2011/12/14

OFBiz Go

App 很紅, 主要在行動設備上, 上下游都很火紅。要談的 App 是現在不太紅的 Ent App (Enterprise Applications), 或是說已經紅過了, 但仍然是每個公司, 組織都會用到的。

App 多是產品, 而 Ent App 是種社會(Social), 俗名是江湖, 充滿交流與妥協, 大多以專案形式進行。就算從產品開始, 後面也會帶專案, 常見區分出軟體, 硬體, 開發, 維護, … 各個階段。

由於 Ent App 牽涉層面通常既廣又深, 以技術角度來看, 擴散方式(銷售, 安裝)一直沒太大改變。現在雖然服務導向, 雲端喊得震天嘎響, 但除了網路基礎服務(信件,檔案), Web應用或特殊應用, 要把 Ent App 放上去, 應該還有些東西要準備好。用雲端的榜樣電與水比擬, 水除了自來水, 還有各式來源; 電除了公共設施, 也有可移動型的, 或私人備援。因此資料的移動能力要具備, 否則還是有些不足。

開放源碼讓技術普及, 加上硬體設備的大幅提升, 過去得詳加規劃, 才能執行的 Ent App, 現在只要在雲端或筆電開個 VM (虛擬機器) 就行開工。再者, 小公司不需要 24 小時運轉的系統, 功能有的話, 需要時再開啟。甚至中型單位, 只要合宜的環境及配套規劃, 也能朝這方面努力。

首先, 要面對的問題是 … 怎麼去開始?

OFBiz 下載頁面中, 寫明只要有 JDK(Java 1.6 SDK), 下載 zip 後解開壓縮檔, 執行指令就可以開始。

似乎還算容易?

但每個平台準備 JDK 其實都不太一樣, 更不用說如果發生衝突的話要怎麼辦, 例如在 Linux 上用 OpenJDK。這些說明字句雖少, 看起來簡單, 毫無疑問是寫給工程人員看的。再加上 Ent App 的社會屬性是有機成長, 如果要修改, 要調整, 按照慣例就得靠自學, 或找人助拳。

以整個過程來看, 愈到後面, 障礙愈高, 的確是不太容易推動。

之前在一種應用源碼管理的實作討論過 可短小, 可長久, 可分享 的客製化方式。路雖然通了一小段, 但想想, 比原來 OFBiz 官方的安裝方式還要複雜, 素人要開始, 會有不小的障礙。

因此做了 OFBiz Go 用一個步驟完成 所有 繁瑣的準備工作。

準備工作有:

  1. 下載必須的 JDK, Python, Subversion, Mercurial 以及相關工具(patch, diff, cURL, 或 Wget), Windows 要再加 MinGW
  2. 安裝妥上面這些東西, 做好設定 … 例如系統變數, Mercurial 的設定, 與 virtualenv 的環境。

當然如果機器上已經有的軟體項目, 就略過不下載, 也不安裝。

寫上一篇的時候, 略過這些步驟。對熟悉這些工具的人, 早就備妥; 但不熟悉的人, 繁瑣且容易漏東漏西的過程, 反而造成困擾。即使自己做, 將這些裝到 Linux, 也碰上不少問題。

想做個 VM 來用, 但每次要把數 GB 的東西搬來搬去, 還得搬進雲裡頭, 舉重若輕恐怕也不太容易辦到。

在支援 Windows 前提下, 也考慮 Puppet, Chef, 或老牌 CFEngine 這類 組態管理 工具。但即便輕如 CFEngine 都必須做額外的安裝設定, 所以這工具還是留給 應用系統, 做為其中的組件。

剩下可用的大概就是系統腳本語言(Shell Script)。

OFBiz Go 是先在 OS X 上寫個 .sh 做完上述工作。然後找到 Windows 2008 用 Powershell 寫個 .ps1。最後用 VMWare 開啟 Ubuntu 11.10, 原本認為 OS X 小改就可以用, 但還是改了不少。

比較特別是 Powershell 挺有 Power 的 … 要正確合法下載 JDK, 需使用者同意。Powershell 可控制 IE 瀏覽器帶出正確下載網頁, 當使用者點選同意後, 繼續腳本的工作。

目前在 OS X 10.6, Windows 2008R2 / 7, 還有 Ubuntu 11.10 測試過。OS X 可能會不太行, 因為環境不乾淨。;-)

只要腳本的下載, 安裝, 驗證的工作做完, 就可和 應用程式源碼溝通。把繁瑣的過程, 劃分成兩個階段, 方便入門者, 也方便自己。

由於大部份工具和 Python 相關(Fabric, MQ), 下週三(2011/12/21) 晚上 19:30 在新竹的 PyHUG 會描述 配置方式應用客製 兩階段的安排, 及運作細節。除了 Ent App, 很多類似的狀況, 也可用相同方式處理。歡迎參加, 和我們一起討論。

2011/03/28

OSDC.TW Tabledown 演講資料與問答

週日(27) 在 OSDC.TW Tabledown 演講的投影片:


利用一些時間把範例整理上傳到 Google code

除了把 Tabledown 修完, 有個 pip 的 req. 檔案能協助把演講提到的 twill, scotch, mechanize, Beautiful Soup, Tabledown 都給裝妥。先將 python, pip 裝完, 接著再參考 00README.txt。

範例要執行, 可能有困難的地方是將 OFBiz 裝起來。而 User 的 Id 預設為數值累加, 不太方便。附上一個修補使 Id 能和 UserName 相同 (試過今天的 trunk)。得事先裝好 Java 6, 接下來再花些時間建系統 ... 有問題的話也請提出 :-)

另外, 把當天遇到的 Q & A 整理如下:
  1. 在某頁從資料庫到試算表的做法為何?
    ⇒ 投影片的試算表是以 "人" 的角度建立資料表達的方式, 都是手工建立的。僅示範從試算表到 Web App 單向, 主要是跨越資料關連,多個畫面,細節這些煩瑣與難度。從資料庫到試算表要自動達成更接近人需要的, 應該是另一個題目。
  2. 如何執行?
    ⇒ 目前範例都是寫死的, 在命令列下執行 XD 日後考慮有無更彈性的做法, 像提供 plugin, 只要準備好試算表加上 plugin 就能處理妥。
  3. 接受的試算表格式? 雲端?
    ⇒ 目前沒有能力處理雲端試算表, 只有 python-excel 專案能接受的 .xls 檔案。
  4. 能否即時執行, 和後端同步?
    ⇒ 範例中時間表(Timesheet)有想過直接與 Web App 同步, 有點這種味道? 但要考量資料同步問題 … 沒直覺的解法, 暫時擱著。([事後] 先解 Q1 問題, 再為 collections 做 diff, 或許類似 git snapshot 做法)
  5. 問題加密 (POS?) … 和 Td 無關, 所以加密 XD
    ⇒ 回覆加密 (POS!)
  6. 範例中 Master 與 Detail 關連?
    ⇒ 簡單版: 沒有關連; 真相版: Master 是鍵值式資料, Detail 是條列式資料 … 原則上都可以多個。而資料的關連由開發者(程式)決定, 例如在專案 Master 有人員 ID 以逗號隔開, 實際上在專案資源畫面有多筆資料。
後來看了 sleepnova 推薦的 Prezi, 另外想到試算表與 XML, Json, Yaml, … 相比, 雖然個個都能記錄資料, 但使用者愛用的原因, 該是較能掌握東西放在哪裡, 即使只有列和行。

感謝四方大德惠予討論, 也謝謝 hcchien 與 OSDC.TW 工作人員的辛勞 :-)

2011/02/18

開放源碼資訊應用系統的開發觀點

資訊應用系統較開放的定義: 公司、組織所需要的應用系統, 下面縮減為企業應用(Ent App), 與當下常見移動 (Mobile) 和 Web 應用有所區別。開放源碼顧名思義即可。身處在公司組織中, 資訊系統所涵蓋的可能是有什麼用什麼, 或依需要採買。企業應用則依公司組織的需求, 所打造的應用 … 有些是獨立系統, 或某個系統的擴充。常要與不同單位, 甚至跨公司組織的各系統聯繫以協同作業。

去年 2010 接觸一個國外頗具規模組織的企業方案導入, 從基礎設施開始到應用系統的那種。儘管方案已落入 M 社手中, 仍有許多可深入思考借鏡之處。

這個需要方案的組織, 雖然考慮過開放源碼方案, 對技術有想像, 對未來有憧憬, 最後還是回到踏實的 … 支援問題。

按捺支援問題, 整理過程中一些溝通討論的部份。

從頭開始的組織, 討論的觀點有多高? 大概有太空那麼高。平常較常用的辭彙字眼, 鮮少在此時派上用場。與非開發者進行討論, 還是得用流行 … 呃, 太空的觀點來溝通, 也難怪不斷有人創造一些東西來滿足。在其中討論的議題有目錄服務, 檔案分享搜尋, 管理監控, 入口網站, 工作流程, 應用系統, … 等。前三個題目, 一般公司組織都給 M 社綁住, 接下來似乎 M 社都把東西都準備好, 都可一次夠足儘管用。

曾被詢問: 如果不用 M 社方案, 這些問題如何解? 兜幾家公司產品才解決又沒參考案例, 說服力自動下降。能否找到適當資源滿足這些要求, 就成了給自己的寒假作業。

選擇以 Java, Python 為基礎, 避免對作業系統的依賴太深。

把問題劃分幾個區塊, 否則以系統/應用分太簡略, 純以開發觀點來看又太複雜:

  • 應用系統: 這是已經存在並使用的應用。ERP, B2B, 入口網站, 網購平台, 生產系統, … 甚是以套件存在的論壇, 而開發成果也在此區塊。
  • 基礎系統: 不需要應用也存在的系統。例如電子郵件, 資料庫, 網站網路服務(Web/FTP), …。
  • 工具: 基本上是支援開發相關工具。像源碼的版本管理, 記錄工作的事例追蹤, 負責測試建置, 文件產生, 資料處理, …
  • 開發作業: 可以是獨立的應用, 但通常除了基礎系統, 也與其他應用系統打交道。現在複雜環境, 選適當語言外, 更需要適當框架加持。

這些區塊的涵蓋面是否恰當, 以流行的 Web 框架來檢視: 資料庫/網站在基礎系統; 編輯器/版本管理在工具區; 開發框架本身在開發作業區; 如果套在入口網站裡, 就看成在應用系統區。

再來把之前討論議題在放進來:
  • 目錄服務: 有名的 OpenLDAP 使用過一陣子, 那時要編得安全一點不太容易。現在 ApacheDS, 有 Java 環境就能很快上手。雖沒 M 社搭配其作業系統的特異功能, 但具備 Kerberos, DNS, NTP, DHCP。另有 Directory Studio 處理綱目和資料都便利, 而單一簽入(SSO)可交給 CAS 處理或 PicketBox。這些放到基礎系統區。
  • 檔案分享搜尋: 從歷史來看, M 社把之前拳王 N 社撂倒後就一直雄據著, 不過移動設備和 Web 普及應該稍有機會推動一下這板塊 … 內容管理交互服務(CMIS)。實作不少, 偏好的是 Nuxeo, 實際選擇視需求而定。也放到基礎系統區。
  • 管理監控: 之前做都是一兩個系統加上數個服務, 要求是把自己做的管好就好, 沒從組織觀點來看。這方面有許多成熟產品, 例如 SpringSurce 有併入 Hyperic。會考慮的是 Zenoss, 畢竟現在有各式各樣服務, 彈性大一些會比較好。而 Java 在開發作業考量與 Zenoss 搭配, 執行記錄方面從 log4j 著手走 syslog 即可。還是放到基礎系統區。
  • 入口網站: 已經流行過好一陣子的題目, 或許每個人都有自己的一套, 就略過。分類的話, 由於依使用方式不同而有差異, 所以放應用系統區。
  • 工作流程: 推薦的是原 jBPM 開發人員從 jBoss 離開, 在 Alfresco 支持下做的 Activiti 專案。從 2010 年底釋出 5.0 以來, 2011 的前兩個月都按表操課, 穩定釋出新版本 5.1, 5.2。具備彈性流程工具外, 比較特別的是考慮開發人員甘苦, 不會一昧討好商務端人員。Activiti 可考慮嵌入與應用共存, 但從服務獨立、聯合管理的角度, 應該是單獨存在的系統, 因此放到基礎系統區。
  • 應用系統: 從開發觀點來看, 只要一個語言就可做任何事, 然而任何人能完成的事情都是有限。現成開源應用系統也不少(ERP, CRM), 加上在雲端的就更多。但能否存活, 像後者在 2010 收了好幾家, 特別讓人有疑慮。因此期望把關鍵資料放在自己可以掌握的地方, 彈性/好用是必需的, 但也不會因為開發專案的公司策略調整或併購而影響。因此選擇 OFBiz 來擔任企業核心的應用系統。

回頭看各區塊, 應用系統依實際狀況而定, 基礎系統補上即時訊息(IM) Openfire 做即時通訊, 另外以通用伺服器 Felix, Karaf, Camel, ServiceMix 統籌日漸增長的服務。工具區塊比較被熟悉, 也常見許多討論個人、團體開發過程中面對的問題與解決方式。這裡對之前 近未來 IT 開發 一文做補充, 成為開發作業區塊:
  • 穩定層: 包含應用系統與基礎系統, 有穩定的界面。例如 ERP 財務的界面, 或像檔案傳輸的方式也固定。
  • 動態層: 原本以樣板打造動態層, 要含括一般且普遍的情況下, 得選用框架。以 Web 來說, 會用 Grails, 他和原本 Java 與企業大宗資源 DB 溝通方式非常的 … 一脈相承, 能快速且彈性建立 Web 應用或服務。在 Web 應用方面, 加上 ZK 協助能使用先進的 Web 技術, 卻毋需太煩惱衍生的問題。而面對複雜的服務與模組, 有更強力的 Scala/Akka 組合以函數編程與靜態語言協助建立穩定的服務。
  • 領域層: 有了上面分門別類的區塊提供各式的服務, 接下來在 grails 與 akka 下, 開發領域相關的東西。

整理如下圖:

歡迎指教與補充。 :)

參考連結:

2011/01/09

Tabledown

目前資訊技術兩股趨勢: 一個是普及的行動設備, 一個是數大的雲端計算。在兩者激盪之下, 各種應用遍地開發。從 TIOBE 索引排名, 以及陸續開張的軟體商店, 就可看出百家(?)爭鳴, 且各家皆各自擁有龐大的支持群眾。

普及的行動設備會演變成為一個人擁有多個設備, 但不連線(不連續)就會造成的問題。Dropbox 解決了檔案問題, 讓檔案同步因此大受歡迎。而雲端運算到後面各個服務的連結也會造成不連續, 簡單舉例: 金流可連續完成, 但物流就不可能。

從結果來推論需求, 如果生產, 金流, 物流都上雲端了, 那在手上(設備)要掌握什麼資訊?
(嗯 … 產品的規劃設計是另一件事。)

要掌握的資訊, 可能人人不同, 也可能隨客戶的客戶而不同(B2B)。

雖然流行的腳本語言(Scripting)能因應快速的變更, 大部分時候在程式碼與資料間是有清楚的界線。這個界線是 … 使用者(或客戶)非常在意資料, 而程式員則關注程式碼。即便可選擇的開發工具很多, 也都很強大, 但幾乎是建立 MVC 下, 類似 rails 模式, 或者是說與資料庫關係密切, 這些都屬於連線(連續)的形式。

最好能夠做到『碼即資料, 資料即碼』(code is data, data is code), 由使用者在掌握資料即能驅動後頭的雲端, 即使不連接也可讓服務運作下去。

不論如何, 資料還是需要載體(Container), 最好的載體應該是試算表。它除了能放置資料, 還能兼顧人們視覺操作的慣性, 可將資料的顯示位置, 存在與否, 還有排列做調整。如果沒有應用程式, 這種方式應該是首屈一指的資料載體。

主角都現身, 可想像一下: 透過試算表來連接各種後端的服務(雲端)。資訊服務業能透過試算表輸入資料(例如使用者需求), 再批次進入報價服務, 每月產生報價單寄送給客戶。至於損溢, 現金流量, 庫存也可定時同步到試算表 … 並竟不是每個人都每秒十萬上下。

基於這樣的出發點, 建立了 Tabledown 專案。簡單來說, 是能夠讓試算表與集合資料(lists, hashes)做雙向資料交換, 透過一個對映集合設定(mapping collections configuration, MCC)來轉換。

已完成的是概念雛形的驗證, 就是在 google code 頁面的範例。陸續會做一些修正, 使用雲端試算表, 以及與 ERP, BPM 連接。

Tabledown 目前是組 Python 的程式庫, 希望有機會改頭換面成為一般工具。而 Tabledown 命名的點子是從 Markdown 而來。



參考