在Linux操作系統(tǒng)上,可以部署的郵箱服務(wù)器種類比較多。如現(xiàn)在比較流行的有Sendmail郵箱服務(wù)器、Qmail郵箱服務(wù)器、Postfix郵箱服務(wù)器等等。不過筆者還是比較傾向于Postfix郵箱服務(wù)器。因為這個服務(wù)器比其他兩個服務(wù)器來說,具有更高的性能。筆者對這個郵箱服務(wù)器研究的比較深;也曾給多家企業(yè)部署過這個郵箱服務(wù)器。所以,非常了解這個郵箱服務(wù)器高性能背后的技術(shù)優(yōu)勢。或許經(jīng)過筆者的一番介紹之后,大家也會越來越中意Postfix郵箱服務(wù)器。
秘密一:利用Deferred對列巧妙應(yīng)付郵件風(fēng)暴問題。
在Postfix郵箱服務(wù)器中,是通過四個對列來管理郵件的。一是Maildrop對列,主要用來存放本地郵件,同時這個對列中的郵件也會被同步復(fù)制到Incoming對列中。二是Incoming對列,主要用來防止正在到達或者隊列管理進程未發(fā)現(xiàn)的郵件。三是Active對列,這個對列主要用來防止隊列管理進程已經(jīng)打開并準(zhǔn)備投遞的郵件,這個隊列往往具有長度的限制。四是Deferred隊列,往往郵箱服務(wù)器會把暫時不能夠發(fā)送的郵件存放在這個隊列中。Postfix郵箱服務(wù)器就是通過這四個隊列來應(yīng)付郵件風(fēng)暴的問題。
當(dāng)有新郵件到達時,Postfix郵箱服務(wù)器會先對自身進行初始化,初始化時Postfix郵箱服務(wù)器會同時接受兩個并發(fā)的連接請求(這個數(shù)字會隨著實際情況的變化而增長)。一般情況下,當(dāng)郵件發(fā)送成功后,可以同時接受的并發(fā)連接的數(shù)據(jù)就會緩慢的增長至一個可以配置的值。不過,如果此時系統(tǒng)的硬件、軟件消耗已經(jīng)達到系統(tǒng)的警戒水平的時候,系統(tǒng)就會停止自動增長。
當(dāng)郵箱服務(wù)器接受到的新郵件數(shù)量超過Postix郵箱服務(wù)器的處理能力,這就叫做郵件風(fēng)暴。當(dāng)出現(xiàn)這個郵件風(fēng)暴的時候,Postix郵箱服務(wù)器會暫時停止去投遞Deferred隊列中的郵件,而是先去處理新接收到的郵件。因為相對來說,處理新接收的郵件要快的多,郵件的延遲要小于處理Deferred隊列中的郵件。當(dāng)郵件風(fēng)暴過后,Postix郵箱服務(wù)器空閑的時候,再回回去處理Deferred隊列中的郵件。如此的話,就可以減少郵件風(fēng)暴對于接收郵件的影響。讓用戶在郵件風(fēng)暴的過程中,仍然可以正常的接收郵件。
秘密二:存儲不可到達的郵件地址,提高郵件分發(fā)的效率。
有時候由于用戶無意中會輸錯郵件接收方的地址,又或者說,對方的郵件地址已經(jīng)注銷等等原因,某些郵件始終無法發(fā)送到對方。這些郵件地址,就叫做郵件不可達。為了防止郵箱服務(wù)器多次嘗試向這些不可達的地址發(fā)送郵件,浪費了不必要的時間與資源。所以,Postix郵箱服務(wù)器會在服務(wù)器的內(nèi)存中保存一個有長度限制的當(dāng)前不可到達的郵件地址列表。
若用戶發(fā)送的郵件地址在這個列表中,Postix郵箱服務(wù)器就會避免對這些地址進行多次的郵件發(fā)送嘗試,而直接返回郵件不可達的信息,從而大大的提高了系統(tǒng)的性能。
不過,在使用這個功能的時候,需要注意幾個問題。
一是這個郵件不可達地址列表是保存在服務(wù)器的內(nèi)存中,而不是像其他配置文件,是存放在服務(wù)器的硬盤上。這就導(dǎo)致當(dāng)服務(wù)器因為意外重新啟動的時候,內(nèi)存中的這份郵件地址不可達列表會丟失。所以,所有時,當(dāng)郵箱服務(wù)器重新啟動后,會明顯感到這個數(shù)據(jù)庫性能有所下降。等到運行一段時間后,性能反而會有所提升。這就使這個“內(nèi)存中的郵件地址不可達列表”在其作用。
二是這個郵件地址不可達列表有長度限制。具體多少長度,則會根據(jù)用戶的配置與服務(wù)器的資源不同而不同。當(dāng)達到規(guī)定的長度是,則會根據(jù)先進先出的原則,把第一個進入這個列表的成員排除出去。這就可以保障,因為對方郵箱服務(wù)器一時的故障而造成郵件不可達的問題。
#p#副標(biāo)題#e#
秘密三:延遲暫時無法投遞的郵件,把資源用在刀刃上。
在郵件發(fā)送的過程中,各種原因都會造成郵件暫時無法投遞。如對方郵箱已經(jīng)滿了,或者對方的郵箱服務(wù)器出現(xiàn)了通信故障等等,都可能導(dǎo)致郵件的暫時不可達。若能夠合理的處理這個狀況,則對提高郵箱服務(wù)器的性能也具有一定的幫助。
而Postix郵箱服務(wù)器,則是通過“時間郵票”的形式來處理這種暫時不可達的情況。當(dāng)一封郵件第一次不能成功投遞給對方時,Postix郵箱服務(wù)器會給這封郵件貼上一個表示將來的時間郵票。而郵件隊列管理程序在處理的時候,發(fā)現(xiàn)一封郵件被貼有“時間郵票”,則會忽略它的存在。如此的目的,就是為了最快的處理那些可以達到的郵件,把資源用來刀刃上。
當(dāng)這個時間郵票到期的時候,Postix郵箱服務(wù)器會嘗試對這封郵件再次進行一次發(fā)送。若此時成功了,郵件就發(fā)出去了。相反,若不成功的話,則Postix郵箱服務(wù)器會再次給這封郵件貼上“時間郵票”。只是,此時這個郵票的過期時間要比第一次的過期時間長整整的兩倍以上。等到這個時間到后,原來的時間郵票就會作廢,Postix郵箱服務(wù)器會重新發(fā)送這封郵件。
最后的結(jié)果只有兩個。一是郵件成功發(fā)送了,二是嘗過了若干次的機會之后,郵件還是不能夠發(fā)送出去,郵箱服務(wù)器就會放棄發(fā)送這封郵件。并把這封郵件的接收者地處存入到上面所講的內(nèi)存中的郵件地址不可達列表;并會返還一個錯誤信息給發(fā)件人。當(dāng)下次用戶再次發(fā)送這個郵件給用戶時,郵箱服務(wù)器可能就直接拒絕了,以提高郵箱服務(wù)器的整體性能。
秘密四:本地郵件與外來郵件不同進程分工合作。
郵箱服務(wù)器接收的郵件從廣義上來說,可以分為兩類。一類是本地郵件,也就是郵箱服務(wù)器內(nèi)部帳戶的互發(fā),一般就是員工發(fā)給員工。第二類是來自于網(wǎng)絡(luò)的郵件,也稱外來郵件,如來自于客戶或者供應(yīng)商的郵件。
在Postix郵箱服務(wù)器中,這兩類郵件時不同的進程分工合作的。如對于來自于服務(wù)器本身的郵件,主要是由Sendmail進程來負責(zé)的,然后再由Pickup進程對Maildrop中的郵件進行完整性檢測。而對于來自外部的郵件,則是由SMTPD進程負責(zé),并且進行安全性檢測。網(wǎng)絡(luò)管理員還可以通過其他的一些方式,如UCE來控制SMTPD的行為。這兩個的區(qū)別主要在于,來自于內(nèi)部的郵件一般認為是安全的,因為都來自于同一個服務(wù)器(有時會往往是在投遞的時候已經(jīng)作了安全檢測,故可以保證本地郵件的安全性)。所以,沒有必要進行安全性檢測。相反,來自于其他服務(wù)器的郵件,可能有病毒,也可能是垃圾郵件,所以需要進行安全性的檢測。
Postix服務(wù)器如此設(shè)計的目的有二。一是提高內(nèi)部郵件轉(zhuǎn)發(fā)的效率;二是節(jié)省了對內(nèi)部郵件進行檢測的時間與資源,把他們用在更需要使用的郵件身上。要知道,對于企業(yè)來說,內(nèi)部員工的郵件轉(zhuǎn)發(fā)可能在占據(jù)郵箱服務(wù)器工作量的一半以上。如此的話,放棄對本地郵件的安全檢測,則其可以大幅度的提高本地郵件接收轉(zhuǎn)發(fā)的效率。同時,也可以提高外部郵件的安全檢測速度。
Postix郵箱服務(wù)器不僅在接收郵件的時候,對本地郵件與外來郵件進行區(qū)別對待;而且,在發(fā)送郵件的時候,也是區(qū)別對待的。