2015/02/09

多層,究竟有幾層?試著定義一下。

一層:
如果沒有使用到資料庫,那一定是「一層架構」,所有的操作全在使用者的電腦上完成,大都利用序列化陣列來當作資料庫也就足夠滿足需求。

※Delphi.KTOP 的資深版主 Jason Wang 表示:
「dBase、Foxpro 等這類的檔案型資料庫也屬於一層架構的一種。」

簡而言之,沒有內建 Service 的檔案型資料庫,都稱得上是一層架構。

在Delphi開發上,最常見的檔案型資料庫就是BDE + Paradox或是Mircrosoft Access。

Delphi / C++ Builder 經典的兩層架構
兩層:
檔案型資料庫升格為遠端資料庫伺服器(RDBMS)後,商業邏輯可以透過遠端資料庫伺服器分散運算,原本應用程式便可服務更多使用者,這就是兩層架構。
而大部分 Delphi / C++ Builder 的開發者,有聽過 BDE、ADO、DBX、FireDAC……等元件,都是使用兩層架構開發。雖然資料庫和開發機器有可能在同一台電腦上,但脫離不了「資料庫邏輯」←→「應用程式邏輯」或「資料庫存取封包」←→「應用程式資料集」交互的過程。



DataSnap 定義的三層架構
三層:
DataSnap 即是把 BDE、ADO、DBX、FireDAC 從使用者電腦拉開的代理者,而在使用者電腦上看不到上述任何元件的影子,這時開發者必須很清楚資料流各階層的傳遞流程及生命週期,就像程式設計中「變數」的設計週期一樣。

利用DataSnap橋接服務(Bridge Service),原本Delphi不直接提供資料連結的平台,也能夠透過這個服務來使用。

但絕大多數的開發者在這個階段,因為對三層的設計方式不熟悉,以及文件資訊不足的惡劣條件下毅然地放棄對 DataSnap 的使用,退守回兩層的開發,這實在是很可惜的事情。

其實 DataSnap 本質並不難,只要關鍵流程透通,三層上的天空很廣大的。

超過三層的「多層」:
你聽過「負載平衡」、「驗證」、「快取」等服務器名稱嗎?這些都是三層架構的一種,因應不同需求而採行的策略,完全取決系統架構的設計導向來定義,沒有一定的套路。

設計前的彈性很足,但框架定義完卻很難修改,所以大型專案必須經過長時間的規畫及時間來鑽研系統的穩定性。

多層大致上已經說完了,是不是還很模糊?

換句話說,就是現在網頁設計規範所提的「前端技術」和「後端技術」

前端:
泛指使用者能夠輕易看到的視覺變化技術。(例如:HTML5、JavaScript 和 CSS)

後端:
使用者看不到的繁瑣處理機制。(例如: PHP、ASP.NET 等)

而連接這兩者中間的那一「層」,就是「中間層」,如同 IIS 所扮演的角色一樣。

多層的架構牽涉的面向太廣大了,所以之後的重心還是放在三層 / 前中後端的內容上。

--- 未完待續 ---

DataSnap 能夠解決的問題?

 

作者:吳祐賓

 

Delphi.KTOP 的資深版主 Jason Wang 及 Sryang 等網友提供了很多相關資料,整理了以下內容: 多層架構可以解決兩層的四大問題: 

 

1. 省錢。
2. 跨網際網路的安全性。
3. 資料庫連線數大量增加,造成效能低下。
4. 一致性的使用者端應用程式開發。


先談談如果要解決上述問題,除了 DataSnap 外,兩層架構下有沒有其它解決上述問題的方法

 

跨網際網路的安全性問題

 

沒有任何一家公司會希望自家的資料庫遭受攻擊,在資訊安全這方面,我們會採用:

  1. 防火牆。
  2. 軟體或硬體 VPN。
  3. 遠端桌面連線。 

 

防火牆的場合:

 

 資料庫仍然需要掛上網際網路,也無法避免 Port Seek (埠位掃描)的攻擊,故實務上更改 Port 的方式也很少被採用,頂多是暫時性的權宜做法。



VPN 的場合:

 

資料庫並不直接連上網際網路,而是透過加密的 VPN 連線,進而讓使用者能夠存取資料庫的資源。

 

SecureBridge 是軟體 VPN 中的佼佼者。圖片來源: Devart

 

利用 VPN 加密封包及分散處理的效果,達到資料安全性傳輸的功能。

 

只是連線數造成的資料庫效能低下仍不可避免,以及網路持續連接的能力讓人緊張,如果是跨國連線,恐怕網路穩定性會讓使用者抓狂。

 

遠端桌面連線的場合:

Windows 內建的遠端桌面有較佳的幀率

 

 離資料庫越近的主機越好!只要網路連接有基本良率,就算斷線也只是畫面中斷,下次連線仍然可以接續上次中斷點使用。

 

最重要的是這種連線方式具有最佳的執行效能。

 

Citrix 的遠端桌面對網路頻寬的要求極低

 

但因為是畫面傳遞,所需的頻寬必須要有一定的水準,版權數和主機承載能力(兩者指的都是「財力」)是評估的重點。

 

而且,資料庫在大量連線時的效能損失的問題依然存在,可以保證的是使用者不會因資料庫連線異常導致輸入資料流失。

 

實戰上也有看到 VPN + 遠端桌面連線的雙保險機制同時被使用,提供給開發人員作為參考。

 

DataSnap 如何能解決兩層開發的問題?

 

 1. 提供 HTTP / HTTPS 及 TCP/IP 兩種通協定,並且可以自定封包格式內容,被破解機率在這一關就大幅下降,等同 VPN 的防護機制。

 

2. 資料庫連線數問題,連線數太多會造成資料庫效能降低;但太少時所花在連線交握的時間也不會讓使用端占上太多便宜。這部份的微調可視實際場合使用「連接池」( Connection Pool )來降低連線消耗。

 

3. 連線不穩定的問題,如果 DataSnap 採用「無狀態」(Status-Less)設計模式,在離線狀態下仍能進行編輯工作,等到連線狀態穩定後再與資料庫同步即可;這和微軟提出的「公事包」概念有異曲同工之妙。

 

只是 DataSnap 要做到上述的功能,大都需要自己額外寫程式,看到這裡想打退堂鼓的人應該不少。

 

按照 DataSnap 歷史路線來看,想要省力開發也不是沒有方法,RemObject Data Abstract 就是其中一個很好的合作伙伴。

RO DataSnap Server 端設計畫面。圖片來源:RemObjects

 

所謂的歷史路線指的是:Borland 一直到現在的 Embarcadero 本身沒有足夠的資源可以完善 DataSnap Server 端,所以讓 3rd-Party 廠商來合作完善,各位可以驗證看看現在的路線是不是依然使用合作策略方式。

 

當然不甘寂寞的高手們(沒錯!指的就是現在看這篇的你!),DataSnap 也提供原始碼讓開發者來設計符合自己需求的 Service ,喜歡全架構運籌帷幄的開發者們快來挑戰吧!

 

雖然能解決這麼多問題,但在少量用戶端的場合時,傳輸效能上並沒有更優於(趨近於)現有兩層架構下各 DataSet (ADO, BDE, FireDAC) 的功能。

 

畢竟就是要透過 DataSnap 再轉一手資料庫封包,這是無法避免的現實。

 

--- 未完待續 ---

2015/02/08

DataSnap? Midas? 你是誰?我應該選誰?

我想你知道 DataSnap ,但對 Midas 可能有點陌生。但提到 DataSnap 就不能不提到它的過往,底下就來介紹一下。
Delphi 3 MIDAS Logo

Midas 全名是:Multitiered Destributed Application Services;
中文是「多層分佈式應用程序服務」。

當時,Oracle 和好朋友 SQL Server 還是個天價計費的時代(現在依然價格不裴),每一個會連線到資料庫的使用者,都是燒錢的版權費用;而 Borland 和 Microsoft 的資料庫通訊的戰爭也還在持續中,這時 Borland 提出由中間應用層來負責對使用者電腦傳送資料封包,除了可以替企業省錢外,還能夠在通訊協定的戰役上扳回一成。

於是 Borland 開始進行輔導企業導入 Midas 這個工作,很有趣的, Midas 產品是另外收錢的「企業服務」,所以也不是任何企業都想使用這個服務。

隨後,好消息是,Midas 的開放,被納入 Delphi 4 以後企業版的產品線中,於是 Delphi 核心技術之一的多層開發更進一步的讓更多開發人員知道。

Midas 在當時是計劃變為中間層元件 (2003.李維.Borland 傳奇.第四章 未完的傳奇),那不就是 BDE 嗎!還好 Borland 最後沒有這樣做,有彈性的中間層開發才能面面俱到。

一直到 Delphi 6 ,Borland 為 Midas 改了個名字: DataSnap ,也確定了往後中間層開發的路線,一直到今天,這個路線一直都沒有太大的變化,也因為如此,才有了這篇的出現。

總結:
Midas 歷經 Delphi 3、4、5 ,從 Delphi 6 開始更名為 DataSnap,直到現在的 XE。
本質都是「多層分佈式應用程序服務」。

另外,Oracle 和 SQL Server 的授權方式也因為 DataSnap 而改變,所以省錢的這個條目已經被消滅,還有使用它的理由?

我想,可能還少講了 Kylix,在 Kylix 3 停止開發後,直到 XE 2 ,以不一樣的跨平台開發手法重生。

在 Kylix 還活著的時候,Linux 本身除了 JAVA 外,並沒有比較好的資料庫連線的方法。
DataSnap 也就應用在這個場合上,就算到現在的 XE ,這個理由也依然適用。

--- 未完待續 ---

2014/12/25

Sublime Text 3 的相關資源

Sublime Text 全程指南
Sublime Text 3 新手上路:必要的安裝、設定與基本使用教學
ZEN-CODING - 教你極速撰寫HTML5與CSS3程式碼

快捷鍵:自動完成 (ctrl + space)
因為和輸入法快捷鍵衝突,所以開啟 Preferences → Key Bindings - User
輸入:
{ "keys": ["alt+/"], "command": "auto_complete" },
{ "keys": ["alt+/"], "command": "replace_completion_with_auto_complete", "context":
[
{ "key": "last_command", "operator": "equal", "operand": "insert_best_completion" },
{ "key": "auto_complete_visible", "operator": "equal", "operand": false },
{ "key": "setting.tab_completion", "operator": "equal", "operand": true }
]
},
    { "keys": ["ctrl+k", "ctrl+/"], "command": "set_mark" }
存檔即可。

Preferences.sublime-settings:
    // 游標設為呼吸燈模式
    "caret_style": "phase",
  // 當前 Line 高亮
    "highlight_line": true,
    // 增加 Line 的間距
    "line_padding_bottom": 1,
     "line_padding_top": 1,
     // 括弧可摺疊
     "fade_fold_buttons": false,
     // Folders 的目錄字體加粗
     "bold_folder_labels": true,
     // 把 Tab 換成 2 個空白
  "translate_tabs_to_spaces": true,
     "tab_size": 2,
  // 存檔時移除多餘空白
     "trim_trailing_white_space_on_save": true


個人使用的 Package:

  • EMMET - HTML + CSS 指令快捷生成
  • ConvertToUTF8 - 提供非英文語格式支援
  • IMESupport - 輸入法框跟隨
  • BracketHighlighter - 對應區塊高亮
  • TrailingSpaces (Ctrl + Shift + P) - 行末多餘空白處理
  • DocBlockr - 自動註解(含格式)產生


Devart UniDAC 和旗下的專用DAC 有何不同?

UniDAC 屬萬用型,各式資料庫都可以使用,但不支援資料庫 API

專用DAC,如 PgDAC, MyDAC, IbDAC 等,只支援其特定資料庫 (但 IbDAC 同時支援 Interbase 和 Firebird 兩種),支援直接連線 (Direct Connect) 和 API (如備份功能) 是其特色。

2014/12/11

Delphi XE 新特性 -- SplitString

官方手冊上是這麼寫的:

這個功能和 TStringList 的 Delimiter 有重疊,但卻少了 Create 和 Free 的動作,在程式寫作上會更為方便。
這也是從 .NET 上學習過來的,就使用它的範例吧:
procedure TForm1.Button1Click(Sender: TObject);
var
  vText: string;
  vStrArray: TStringDynArray;
  vPos: Integer;
  vStrList: TStringList;
begin
  vStrList := TStringList.Create();
  vText := 'there is a cat';
  vStrArray := StrUtils.SplitString(vText, ' ');
  for vPos := 0 to Length(vStrArray)-1 do
    vStrList.Add(vStrArray[vPos]);
  ShowMessage(vStrList.Text);
  FreeAndNil(vStrList);
end;

回傳結果:

比較要注意的地方是,Delimiters 參數雖然是 String 但只接受一個字元的內容。
如果超過兩個字元,會得到無法預期的結果。


2014/12/02

Indy 操作 SMTP 發生 "Could not load SSL library"?

在 Indy 操作 SMTP 時,Delphi 跳出「Could not load SSL library」的訊息。

去 Win32 OpenSSL 網站下載個 「Light」版來安裝,就能解決這個問題了!

另外,這個網站有更詳盡的解說:"Cannot load SSL Library" using Delphi XE7

2018/05/04 更新:
要取得編譯給 Indy 用的 SSL 檔案才行。連結置於「延伸閱讀」裡。

延伸閱讀: