• 如何使用 Microsoft Azure Media Services 進行現場直播 (Live Streaming)

    感謝北科大劉建昌同學翻譯 微軟公司 Azure Media Services 團隊主管  Jason Suess 於 2014 年 9 月 10 日所發表的文章 http://azure.microsoft.com/blog/2014/09/10/getting-started-with-live-streaming-using-the-azure-management-portal/

    louis_bebe_barron_greenwich_village_studio

    不久之前,微軟公司宣布了 Microsoft Azure Media Services 即時直播服務 ( Live ) 開始進入技術預覽階段,公開接受用戶測試。而這些即時直播服務其實早已被 NBC 運動頻道用於多項重大運動賽事直播,包括英超聯賽、NHL、週日橄欖球之夜 ( Sunday Night Football ) 以及 2014 年索契冬季奧運會。在最近剛結束的 2014 世界盃足球賽期間,Azure Media Services 即時媒體服務同樣的也被10 家世界性的電視傳播公司用來轉播比賽。也因此,我們對於這項服務的穩定性、可擴充性以及性能都深具信心,也很高興可以讓所有使用者都可嘗試提供即時直播服務給他們的用戶。

    自本周起 Azure Media Services 團隊將撰寫多篇文章,內容涵蓋了 Microsoft Azure 即時串流服務的功能以及如何使用它們。首先,我們會介紹一些基本的即時串流所需要的一些要件,並且將其應用到一個特定的場景 (網路直播桌面)。而我們只需要透過 Azure 的管理入口網站,無需任何的程式碼即可達到所需要的設定。但是在未來的幾天,將會有另外一篇文章說明如何使用 Microsoft Azure SDK 以程式控制的方式來達到相同的設定。

    即時串流的基本組件 :

    以下將開始介紹在進行即時串流時所需要用到的組成,並且在文章的最後,將這些組件做結合。

    • Azure 的訂閱帳戶

    如果您還沒有微軟的 Azure 帳戶,您需要先到http://azure.com上建立一個新的Azure帳戶,並且在購買前,會有一段免費期可供試用。

    • Azure Media Services 媒體服務帳戶

    如果您還沒有創建 Azure 媒體服務帳戶,這裡有一些相關文件,說明如何建立一個 Azure 媒體服務帳戶http://azure.microsoft.com/en-us/documentation/articles/media-services-create-account/

    • 視訊攝影機

    在本篇文章中,將使用筆記型電腦上的網路攝影機,如果您要使用其它的攝影機,而您的攝影機有提供數位輸出,可直接透過 USB 將攝影機連接到 PC,並且透過軟體進行編碼。倘若您的攝影機沒有支援數位輸出,那您則需要一個視訊擷取卡 ( video capture card ) 將攝影訊號傳入至 PC。

    • 即時編碼器 (Live Encoder)

    目前 Azure Media Services 媒體服務支援兩種即時內嵌 ( live ingest ) 協定 :

    fragmented MP4/Smooth Streaming 和 RTMP (Real Time Message Protocol)。

    目前支援 RTMP 這項協定的編碼器軟體已經變得相當普遍,包括 :

    1. 免費的編碼器軟體 ( Flash Media Encoder 和 FFMPEG )

    2. 平價之商用編碼器軟體 ( Telestream 的 Wirecast )

    3. 生產高價值產品 ( NewTek 的 Tricaster )

    4. 專業級的編碼器 ( Cisco, Elemental, Image 等 )

    在本文範例中,會使用 Telestream 的 Wirecast 做為示範用的編碼器,如果您沒有此一編碼器軟體,可以從Telestream的網站去下載 Wirecast 試用版,它提供了一段免費試用期。需要注意的是,視訊編碼需要耗用相當大的 CPU 資源,因此當以下範例在做視訊編碼時,會限制只有三個編碼品質等級 ( quality level ),並且產生相對的降低位元速率 (bit rates),若您所使用的筆記型電腦或是 PC 其 CPU 運算能力較低,您需要去監視 CPU 的使用率,若一直高於 70% 的話,您需要考慮刪除一個品質等級或是降低位元率和降低影片解析度。

    • 高速的網路連接

    要提供視訊直播的服務,您需要連接一個高速的網路,而這個網路需要有相當穩定的傳出速度 ( 至少要為傳送視訊的位元速率的 1.5倍 )。考慮到編碼器輸出的位元速率會有波動,因此在本例中,我們建立了三種品質等級的串流 (400、600、900 Kbps),合計總位元速率為 1900 Kbps,因此最少需要 2850 Kbps (2.85 Mbps) 的網路傳出速率。

    • Azure Media Services Channel 媒體服務通道

    通道 ( Channel ) 是在 Azure 媒體服務中的功能,用來實現即時串流。通道在 Azure 媒體服務範圍內提供編碼器輸出一個內嵌點 ( ingest point )。

    • Azure Media Services Asset 媒體服務資產

    在媒體服務中資產 ( Asset ) 如同一個容器 (Container),用來儲存所有與您的串流有關連的音訊、視訊、中繼資料等。

    • Azure Media Services Program 媒體服務節目

    Azure Media Service Program 媒體服務節目是 Azure 媒體服務的運作實體,其運作的流程為,建立一個通道,並且開始將串流透過通道寫入資產 ( Assest ) 中。

    • Azure Media Services Streaming Locator 媒體服務串流定位器

    當您想要讓資產 ( Asset )可以開始存取流時,您需要在資產中建立一個定位器。

    • Azure Media Services Streaming Endpoint and Streaming Units 媒體服務串流端點與串流單位

    1. 串流端點 (Streaming Endpoint) 提供了一個URL,從中您可以得到您的即時串流或是 VOD (Video On Demand) 資產,同時,也提供了動態封裝功能以及安全的傳送串流。

    2. 串流單位 (Streaming Units) 保證了一定的最大輸出量提供給串流端點,每個串流單位提供了 200 Mbps 的串流流出產量,並且根據使用上的需求,可以增加更多的容量到您的串流端點。

    • Azure CDN

    在不久的將來,我們將直接整合 Azure CDN 和 Azure 媒體服務。完成之後,串流端點將可以有一個新的設定。那就是允許直接配置一個 Azure CDN 端點連接至您的串流端點。在尚未完成整合的此時,您可不使用 CDN 直接由串流端點作串流播放的動作,或是聯絡 Azure support 部門,商請微軟公司為您的串流端點設置 Azure CDN。

    • 視訊撥放器

    Azure 媒體服務的串流端點提供了動態封裝的功能,因此可用來針對多種不同用戶端所使用的通訊協定,提供不同的媒體串流格式 ,例如 : iOS 使用到 HTTP 即時資料流版本3格式 ( HLS version 3 ) 。在以下範例中,我們將使用一個遵循 動態與適應性媒體串流標準 (MPEG-DASH) 的 HTML/DASH.js 撥放器來支援多個平台的影片撥放 (電腦瀏覽器、Android、Windows Phone)。

    有關更多動態封裝的資訊,可以去 Channel9觀看 Nicks 的影片或是到 MSDN網站 查詢。

    實際範例 : 網路直播

    現在,讓我們來解釋一下本篇案例將可以達到何種效果。

    在以下的步驟中,我們將建立一個網路直播,用來撥放電腦視訊鏡頭所拍攝的事件。在直播串流的專有名詞中,我們可以把這項直播想像成一個”事件”(event)並且擁有一個開始的時間和結束的時間。這個觀念和我們平常在電視上看到的直播節目(線性串流Linear streaming)為一個對比,在之後的介紹文章中,我們也會介紹如何使用Azure媒體服務來達到線性串流。

    事前設定(Pre-Event Setup)

    在要進行直播的事件前,我們需要透過以下的步驟來做事前設定。

    注意 : 這些步驟可以在任何時間點進行,而不需要趕在開始直播前做設定。

    建立一個 Azure Media Services channel 媒體服務通道和串流端點

    在第一組設定步驟中,我們將使用Azure管理入口網站配置一些基礎建設,這些基礎建設將要用來接收來自編碼器(encoder)的直播串流還有來自客戶端的撥放設備所傳送的封包(packet)。

    1. 點擊連結到http://azure.com,然後在最上方的選單中點選”入口網站”(Portal),登入您的Azure訂閱帳戶,您將會進入到Azure的管理網站。

    clip_image002

    2. 在最左側的垂直選單中,選取”媒體服務” (MEDIA SERVICES),您將可以看到在 Azure 訂閱帳戶中的所有媒體服務。

    clip_image004

    3. 選取你要在哪個媒體服務中建立這項範例。

    在這篇文章中,將使用先前建立好的名為 barttest 的媒體服務。

    您可以在媒體服務裡面看到頂端的選單,這裡可以用來建立和控制所有媒體服務的細部設定。

    若您已經使用 Azure 媒體服務一段時間的話,您將會注意到,現在新增”通道”這項新功能,在這裡可以管理和控制 Azure 媒體服務的即時通道 ( Live Channel )。

    4. 選取最上方選單的”通道”選項,將會列出您在這個媒體服務中所建立的通道清單(如果您有建立的話)

    5. 若您還沒有建立任何的通道,則在下方會顯示”您沒有任何通道”,選取”新增通道”,將會打開一個對話寬,在這個對話框中設定您的通道屬性。

    clip_image006

    6. 在”建立新的即時通道”對話框中,輸入您的通道名稱。

    接下來要指定通道所使用的採集內嵌協定 (ingest protocol)。在本範例中,我所使用編碼器為 Wirecast,其輸出嵌入協定為RTMP。

    最底下有三個選項 :

    A. 立即啟動新通道” : 選取這個選項,之後您就不需要再做額外的動作去啟動這個通道。

    B. ��加入一個資料流單位” : 這個選項在您的串流端點上沒有任何串流單位時,將會自動預設為選取。選取這個選項,Azure 將會自動提供一個串流單位給您,這樣您就不需要再去花時間做設定。

    C. 將影片內嵌限制為我電腦的目前IP位址” : 若選取這個選項的話,它會為您的通道申請一個 IP 存取控制清單 (IP access control list , ACL ),ACL 將會鎖定這個通道只能夠在您的電腦上作輸入的動作。在本範例中我們將此選項取消。

    clip_image008

    7. 點擊對話框右下角的確認按鈕,則Azure媒體服務就會開始建立一個新的通道,並且將一個新的串流單位加到您預設的串流端點中。

    您可以在螢幕的底部看到建立新通道的進度列,新增一個新的通道大概需要花上幾分鐘的時間。

    clip_image010

    配置和啟動編碼器 (Encoder)

    透過上面的事前設定,我們現在擁有了進行媒體服務時所需要的基礎建設。

    下一個步驟則是設置 Wirecast,並且在我們的 Azure 服務通道上啟動它。

    為了加快設定的步驟,我們使用先前已經建立好的 Wirecast 配置文件,在這裡面已經設定好了即時轉播所需要的設定。但是在本文中將不會介紹這個文件的細節,在未來的幾個禮拜,另外一位作者 Cenk Dingiloglu  將會介紹更多關於編碼器的細節。

    1. 下載 Wirecast 配置文件 http://jasonsueblog.blob.core.windows.net/wirecastdocument/WirecastDocument.wcst

    2. 打開 Wirecast 和剛剛下載的配置文件。您很可能得到和下面圖示一樣的錯誤,那就是 Wirecast 找不到文件中所描述的媒體裝置。會顯示這項錯誤的原因是因為您並沒有使用與本文中相同的錄影設備。在這裡我們先點擊取消,在下一個步驟中我們將會解決這個問題。

    clip_image012

    3. 在 Wirecast 的用戶介面中,我們可以新增新的影像來源。

    在用戶端的底部有三排來源,點取”+”,並且選擇相機的圖示,此時會顯示目前連接電腦的錄影裝置,選取您要的錄影裝置之後,您就可以在錄影來源上看到目前攝影機的輸出畫面。

    clip_image014

    clip_image016

    clip_image018

    clip_image020

    4. 選取 Wirecast 的 ”Output” 清單,並且選擇 ”Output Setting”。

    您可以在對話框上看到,目前有三種串流編碼的品質等級 (400Kbp、600Kbp、900Kbps)。

    400Kbp 品質等級是使用 H.264 視訊編解碼標準中的 Baseline profile 編碼格式(H.264 Baseline profile),用來支援舊的 Andorid 播放設備,而 600Kbp 和 900Kbps 品質等級則是 Main profile編碼格式,用來提供高品質的視訊水準。

    在對話框中唯一缺少的則是目標串流位址(Address),我們在稍後會填寫上去。

    clip_image022

    clip_image024

    5. 回到Azure管理入口網站並且找到您的通道清單。

    在通道清單上選取內嵌 URL (INGEST URL),並且複製這段URL。

    clip_image026

    6. 再次回到 Wirecast 並且選取 ”Output Setting” 對話框,將剛才複製的內嵌 URL 貼到 ”Address” 框中,在這裡要確保三種品質等級的串流編碼都有進行此項動作。

    clip_image028

    7. 點擊”OK”按鈕。

    8. 點擊您在步驟三時所建立的錄影來源,並且讓它顯示在使用者介面上 ”Preview” 的位址

    clip_image030

    9. 接下來,點擊“—>”按鈕,將“Preview”的畫面移動到“Live”上,此時您在畫面上可以看到錄影的輸出

    clip_image032

    10. 完成以上的步驟,您已經完成了所有 Wirecast 的設定,剩下唯一的步驟就是要將您的串流”推”’到您的 Azure 媒體服務通道上。

    點選左上角 ”Stream” 按鈕,若一切順利的話,您將可以看到有一個紅點在按鈕中,讓您知道您目前正在進行直播。

    clip_image034

    11. 現在您可以檢查串流是否正確地從預覽的發送點傳送到通道中。

    回到Azure管理帳戶中,在底部的工具列選取”播放”按鈕。此時會有對話框出現,選擇”播放預覽URL”,這個動作將會打開一個視訊撥放器,並且將其連接到您通道上的預覽URL。

    clip_image036

    NOTE : 注意,若您有任何理由需要停止編碼器並且重新啟動的話,您首先需要在Azure管理帳戶上選取”重設通道”來重新調整您的通道設定。

    開啟事件 (Event) 和播放串流

    現在已經將視訊串流移動到通道之中,現在我們可以透過建立媒體服務資產(Asset)、媒體服務節目(Program)還有媒體服務串流定位器來開始我們的事件(Event),並且讓觀看者可以透過串流端點來觀看我們的直播。

    我們將使用一個快速的方法來達到以上的所有目標。

    建立和開啟節目

    1. 回到 Azure 管理帳戶,並且進入到通道的設定頁面裡,點擊頁面最下方工具列的”啟動資料流”,一旦完成這項步驟之後,通道列表上的”發行URL”將會被填入,您可以從上方的串流端點上拉進您的串流。

    clip_image038

    clip_image040

    播放直播串流

    現在,直播串流已經被存入資產中,資產是可以從串流端點中拉出的,並且可以動態的打包目前我們所支援的協定 ( MPEG-DASH,、HLS version 3、 HLS version 4、HDS、Smooth Streaming ),我們將充分利用這項功能讓直播串流可以在桌上電腦、iOS  和Android設備上播放

    1. 在 Azure 管理入口網站中,在通道列表的頁面,選取複製”發行URL”。

    2. 將"發行URL"將它貼到任何一個文字編輯器上

    它看起來像是

    “http://<您的帳號名稱>.origin.mediaservices.windows.net/<locator_guid>/<stream_guid>.ism/manifest”

    在這段URL上添加 (format=mpd-time-csf),這將告訴串流端點要把串流打包為 MPEG-DASH。若增加的是 (format=m3u8-aapl-v3)則是告訴串流端點將串流打包為 HLS (version3)。

    3. 在 Windows PC 或 MAC 上,(您需要一個瀏覽器可以支援擴充軟體資源,像是最新版本的 Internet Explorer 或 Chrome ),您可以透過http://aka.ms/dashplayer,用來測試您的串流。

    在頁面頂端貼上 DASH URL 並且選取 ”Load”。您可以在Android裝置或是Windows Phone重覆這項動作。

    NOTE : DASH 撥放器也可以用來把 DASH URL 當成查詢的參數,換句話說,您可以建構一個如以下範例的URL,並且分配到不同的裝置上

    http://dashplayer.azurewebsites.net/?URL=http://<您的帳號名稱>.origin.mediaservices.windows.net/../…ism/manifest(format=mpd-time-csf)

    4. 在 iOS 設備上,打開 Safari 瀏覽器,並且輸入 HLS ( version3 ) 的URL,就可以直接獲取本機播放器的串流,您也可以建立一個帶有視頻標籤的 HTML5 頁面,並且給予它一個 HLS 的 URL 作為其視訊的來源,來達到同樣的效果。

    停止事件

    當要結束一個事件時,您需要停止將串流傳入到資產中,這可以透過一個簡單的步驟來達成。

    回到 Azure 管理頁面,並且選擇您所使用的通道,在最底下的工具列中,選取"停止資料串流"。這個動作將會阻止節目在您的通道中運作並且會將其刪除。

    clip_image042

    我們的即時服務所擁有的功能之一,就是我們的資產在即時或是VOD狀態是無縫接軌的,如果您現在去連接先前的URL,您還是可以發現原先的串流還是存在,但是是VOD而不是即時的。

    清除通道

    若您想要在通道內運行其它的節目,您當然可以清除掉先前的串流。

    1. 第一,透過選取 Wirecast 上方的"Steam"按鈕,停止傳送串流,之後就可以關閉編碼器。

    2. 第二,回到Azure管理頁面,選取"通道",並且選取最下方工具列的"停止通道"。當通道狀態變為"已停止",則表示該通道並不會消耗任何的資源,當然這樣也不會有任何的費用產生。

    clip_image044

    clip_image046

    下次您要再次使用該通道時,您可以選取"啟動通道",此時該通道會再次的啟動,並且擁有相同的內嵌URL ( ingest URL ),這樣您就不需要重新設定您的編碼器了。

    3. 最後,關於串流端點,若您想要繼續提供 VOD 的紀錄,則您需要讓串流端點保持運作。但是若您不需要,則可以進入到"資料流端點"頁面中,在最底下選取"停止",則您的串流端點就不會再繼續運作。

    clip_image048

    結論以及下一步發展

    在上面的文章內容中,我們已經透過 Azure 的管理頁面來進行設定、執行、移除一個即時的串流。在未來的幾天,我們將會發表更多文章,內容涵蓋了如何對使用 RTMP 的編碼器進行設定、如何使用我們的 SDK 來執行現場活動 ( live event )、如何保護影片內容的安全性以及如何進行線性串流 ( linear streams )。

  • 如何在 Azure Cloud Services 和 Azure Virtual Machines 上保留對外 IP 位址

    感謝北科大劉建昌同學翻譯微軟公司 Microsoft Azure 主管 Mahesh Thiagarajan 所發表的文章 http://azure.microsoft.com/blog/2014/05/14/reserved-ip-addresses/

    微軟公司於 2014 年 5 月 12 日宣布正式推出 Microsoft Azure Cloud Services 與 Virtual Machines 保留對外 IP 位址 ( Reserve IP ) 功能。在這篇文章中,我們會介紹保留對外 IP 位址的相關資訊,並且如何在 Microsoft Azure Cloud Services 與 Virtual Machines 使用這項功能。除此之外,也會介紹收費標準和不支援保留 IP 位址的情況。您若想要閱讀關於保留對外 IP 位址 ( Reserve IP ) 的技術文件,可以到這個網站上取得

    甚麼是保留對外 IP 位址,我何時需要用到它?

    隨著最新版的 PowerShell 釋出,Microsoft Azure 允許您在既有的 Azure 訂閱帳戶上使用保留對外 IPv4 位址。您可以無限期的將這些 IP 位址保留您的 Azure 訂閱帳戶上,並用於此帳戶內的 Microsoft Azure Cloud Services 與 Virtual Machines 之服務。本篇文章主要著重於如何保留對外的公開之 IP 位址。至於如何固定虛擬網路 ( Virtual Network ) 內部各虛擬機器的 IP ,相關資料可參閱此篇文章

    您可能會需要用到保留對外 IP 位址的原因如下 :

    以 A-Record 設定 DNS 時不用擔心 IP 位址改變

    Microsoft Azure Cloud Services 或 Virtual Machines 預設在用戶關閉或是刪除一個虛擬機器之後,對外的 IP 位址就會釋出,下次再次啟動虛擬機器時對外 IP 就可能改變,這對 DNS 以 A Record 設定時造成困擾,如果用戶使用保留對外 IP 位址功能,就會持續保留同一個對外 IP 位址。可以避免虛擬機器再次啟動時重新分配新的 IP 位址,造成重新設定 DNS 的問題。

    企業內部網路安全考量

    有了保留對外 IP 位址功能,企業內部 Proxy 伺服器或防火牆即可針對此一固定 IP 位址進行存取控制 (ACL),而不再需要擔心當您重新啟動或是停止虛擬機器時,內部相關 Proxy 伺服器或防火牆又要新設定。

    下圖顯示了 IP 保留對外 IP ( Reserved IP ) 的運作方式,Azure 可以單一區域資料中心的範圍內提供保留對外 IP 位址 ( Reserved IP ) 的功能,在此資料中心的 Cloud Services 都可以運用所保留的 IP 位址。

    clip_image002

     

    如何在 Microsoft Azure 上保留一個對外的 IP 位址

    您可以在您的 Azure 訂閱上使用 Azure PowerShell cmdlets 或是 REST APIs 建立一個保留 IP 位址。您可以在多數微軟 Azure 資料中心使用保留 IP 位址的功能。除了以下地區資料中心 :

    • 巴西
    • 中國東部
    • 中國北部

    Azure 團隊會盡快讓這些地區未來也支援此項服務。

    請注意,Azure 目前尚未支援透過管理者入口網站直接設定留對外 IP 位址的功能。目前必須使用 PowerShell 或是 REST API,以下為使用 PowerShell cmdlets 建立一個全新並會保留對外 IP 位址的範例 :

    New-AzureReservedIP – ReservedIPName “MyWebsiteIP” –Label “WebsiteIP” –Location “Japan West”

    對於之前就已經建立好的雲端服務和虛擬機器所配發的 IP 位址,目前無法直接保留該 IP 位址,但相信在不久的將來,Auzre 團隊就會提供這這項功能。

    如何使用一個保留的 IP 位址建立虛擬機器

    一旦一個保留的 IP 位址已經建立完畢,您就可以使用該保留 IP 位址來建立虛擬機器。以下是運用 PowerShell cmdlet New-AzureVM 來使用保留 IP 位址建立虛擬機器的範例 :

    New-AzureVMConfig -Name "WebAppVM" -InstanceSize Small -ImageName $images[130].ImageName | Add-AzureProvisioningConfig -Windows -AdminUsername $username -Password $password | New-AzureVM -ServiceName "MaheshWebApp" -ReservedIPName "MyWebSiteIP" -Location "Japan West"

     

    當建立妥保留 IP 位址之後,即便遇到下列的情況,也不會釋放對外 IP 位址。

    關閉虛擬機器時

    過去當虛擬機器關閉時,對外 IP 位址立即被釋放,當虛擬機器重新開啟之後,Microsoft Azure 會再重新分配一個新的對外 IP 位址給虛擬機器使用。現在若用戶保留對外 IP 位址,當虛擬機器重新開啟仍會使用原本保留的 IP 位址。

    刪除虛擬機器時

    當您刪除使用保留 IP 位址的虛擬機器後,保留的 IP 位址依然會保存在您的 Azure 訂閱帳戶中,以利您於未來您會再次將虛擬機器佈署在此資料中心時使用該 IP 位址。

    您可以參考虛擬機器REST API文件

     

    如何使用一個保留的 IP 位址來建立雲端服務 (Web/Worker Roles)?

    除了虛擬機器可以使用保留對外 IP 位址之外,同時我們也可以將此功能應用在雲端服務 ( Cloud Services ) 的建置。您需要去下載 2.3 板之後之 Azure SDK 才能夠使用此項功能。

    以下為在您的服務定義檔 (.CSCFG) 中使用保留對外 IP 位址的範例 :

    <?xml version="1.0" encoding="utf-8"?><ServiceConfiguration serviceName="ReservedIPSample" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="4" osVersion="*" schemaVersion="2014-01.2.3">  <Role name="WebRole1">    <Instances count="1" />    <ConfigurationSettings>      <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true" />    </ConfigurationSettings>  </Role>  <NetworkConfiguration>    <AddressAssignments>      <ReservedIPs>       <ReservedIP name="MyWebSiteIP"/>      </ReservedIPs>    </AddressAssignments>  </NetworkConfiguration></ServiceConfiguration>

    請注意,當 Web Role / Worker role 被刪除時,保留的 IP 位址還是會被放在您的 Azure 訂閱帳戶中,當下次在同一個區域資料中心要建置新的 Web/Worker Role 時,同樣的也可以使用此保留 IP 位址。

    如何將保留的 IP 位址從 Azure 訂閱上取消?

    若保留的 IP 位址已經沒有使用在任何一台虛擬機器或是雲端服務上時,微軟公司建議您最好將此保留的 IP 位址取消,這樣才不會有額外的費用產生。對於保留 IP 位址的計費方式,詳細資料請參考這裡

    以下指令為使用 PowerShell cmdlet 可以將保留的 IP 位址從您的訂閱中取消 :

    Remove-AzureReservedIP -ReservedIPName "MyWebSiteIP" –Force

     

    保留對外 IP 位址與虛擬網路內的同質群組 (Affinity Group)

    目前 Microsoft Azure 尚未支援在虛擬網路內的同質群組 (Affinity Group) 中建立保留對外 IP 位址的虛擬機器或是雲端服務。當您嘗試在虛擬網路內的同質群組中建立虛擬機器,您會得到下列的錯誤訊息

    New-AzureVM : BadRequest : The deployment contains VirtualNetwork DemoVNET that belongs to an Affinity Group and ReservedIP that belongs to a region. This combination is not allowed.

     

    保留對外 IP 位址與虛擬網路

    在這個版本中也支援在同一區域資料中心之虛擬網路 ( Virtual Network ) 中使用保留對外 IP 位址之功能,您可以在此 Blog 中找到更多的詳細資料。Microsoft Azure 支援在虛擬網路中使用保留對外 IP 位址的方式來建置雲端服務或是虛擬機器。

     

    保留對外 IP 位址的費用

    IPv4 址位是非常稀少的資源,且每個地區分配的數量不定,因此 Microsoft Azure 對於保留對外 IP 位址的收費在不同的地區有不同的定價。費用相關資訊可參閱收費常見問題。請注意雲端服務內至少應要有一個運行中的 Web Role / Worker Role 或虛擬機器實例。

    在您的帳單中,您會看到兩個部份是關於保留 IP 位址的 :

    保留 IP 位址的時間 :

    保留的IP位址在您的訂閱中保留的總時間數 (以小時為單位)

    包含 :

    1. 沒有用在任何運作中的雲端服務或是虛擬機器的保留 IP 位址
    2. 訂閱中額外使用的保留 IP 位址

    保留 IP 位址的重新映射 :

    每當 IP 位址要在一個新的雲端服務上使用時,就會被認為是一個重新映射。您可以在此參考重新映射計價的相關方式

    每個訂閱保留 IP 位址的上限 :

    每個 Azure 訂閱帳戶最多可以保留到五個 IP位址,但是若您需要在您的訂閱帳戶中使用保留更多的IP位址時,您可以透過點擊這裡申請,並可參考Azure訂閱限額文件

  • Azure BizTalk Services Hybrid Connections (技術預覽)

     

    感謝北科大劉建昌同學翻譯 微軟公司 Microsoft BizTalk 團隊主管  Harish Kumar Agarwal 於 2014 年 5 月 13 日所發表的文章 http://azure.microsoft.com/blog/2014/05/13/hybrid-connections-preview/

    hybrid connections

    混合連接服務 (Hybrid Connection)

    2014 年 5 月 Microsoft Azure 推出了一項新的技術預覽功能 : Azure BizTalk Services Hybrid Connections,使用 Hybrid Connections 服務可以輕易的在 Azure 上部屬一個混合式的應用程式。

    Hybrid Connections 服務是 Azure BizTalk Services 上的一項功能,用戶只需要在 Azure入口管理網站上操作,即可讓您的 Azure Website 或是行動服務可以穿透防火牆連接自己本地資料中心內的資料與服務。除此之外,為了讓您可以輕鬆的體驗這項新服務,Microsoft Azure 目前提供免費體驗 Azure BizTalk Services Hybrid Connections 的方案。

    Hybrid Connections 服務支援所有 Azure Websites 所支援的程式語言與框架( .NET, PHP, Java, Python, node.js )以及 Azure 行動服務所支援之後台程式語言 ( node.js, .NET ),也支援各種微軟公司或非微軟公司之企業軟體應用系統 (LOB application),包含許多使用特定通訊協定 ( protocols ) 之應用程式。使用 Hybrid Connections 服務時,不需要去改變網路周邊的設定 ( 不需要配置 VPN 或是新增特定之防火牆連接埠)。它提供了企業系統管理人員能夠管理與控制混合式應用程式所使用之內部資源。

    Hybrid Connections (Preview)

    透過 Hybrid Connections 服務,Azure Websites 和行動服務上的程式碼能夠如同在企業內部網路般存取本地端的資源。也因為如此,應用程式系統管理員可以簡單且靈活地,將面對外部用戶前端服務層輕易地移往 Microsoft Azure,延伸既有企業應用程式成為混合式的應用模式。

    使用 Hybrid Connections 服務來連接您的 Azure Websites 和本地端資源 :

    1. 從 Azure預覽入口網站 選取您的網站,並且在操作介面中選取 Azure BizTalk Services Hybrid Connections 並且點擊新增

    clip_image002

     

    2. 選擇一個現有的 Hybrid Connections 服務,或是創建一個新的 Hybrid Connections 服務

    clip_image004

    a. 輸入 Hybrid Connections 服務以及主機名稱,並且設定連接本地端資源的連接埠

    clip_image006

    b. 使用現有或是創建一個新的 Azure BizTalk Services Hybrid Connections 服務實例

    clip_image008

    3. 點擊 OK

    一旦連接創建好之後,其狀態將顯示為 "未連接" ( Not Connected )。若要完成連接建立,則須從任何本地端的 Windows Server 主機點擊連接

    clip_image010

    4. 選擇 Hybrid connection

    5. 點擊 Listener Setup

    clip_image012

    6. 在 Hybrid Connections 連接的屬性頁面,選擇 "Install and configure",這個動作要求您做 Hybrid Connections 服務的權限設置

    clip_image014

    7. 設定完權限之後即完成 Hybrid Connections 服務的設定。

    當 Hybrid Connections 服務的狀態顯示為 "已連接" ( Connected ),這就表示您的網站已經連接到本地端伺服器了。

    行動服務則可以透過 Azure入口網站 進行配置 Hybrid Connections 服務。

    1. 建立一個新的 BizTalk 服務,並且在 BizTalk 設定頁面上選取新增一個混合式連接 (Hybrid Connections)

    clip_image016

    2. 新增一個混合式連接

    clip_image018

    3. 選取您的行動服務,並且選擇混合式連線

    clip_image020

    4. 點擊新增混合連線,並且選擇與您的行動裝置建立連線的BizTalk服務以及混合連線

    clip_image022

    透過使用混合式連接,您現在可以在 Azure Website 或行動服務上使用相同的應用程式連接字串和 API。

    舉例來說,若您要連接到一個本地端的 SQL server (payrollSQL.corp.contoso.com)

    您在 Azure Website 或行動服務上可以使用相同的 SQL 連接字串 (“Data Source=payrollSQL.corp.contoso.com;Initial Catalog=payrollDB;User ID=<user>;Password=<password>”)

    若想要了解更多關於混合式連接的資訊,請參照以下英文技術資源 :

    · Overview: Hybrid Connections

    · How-To: Connect an Azure Website with an On-Premises Resource

    · Tutorial: Connect an Azure Website to an On-Premises SQL Server using Hybrid Connections

    · Tutorial: Connect an Azure Mobile Services .NET Backend to an On-Premises Resource using Hybrid Connections

  • 15 分鐘將 ASP.NET MVC Movie 範例程式導入 Azure Redis Cache

    原始文章發佈於 MVC movie app with Azure Redis Cache in 15 minutes

    最近公開預覽的 Azure Redis Cache 很容易就能整合進您的 Azure 網站應用程式中,這裡我將 MVC Movie 範例程式整合 Azure Redis Cache 然後部署到 Azure 網站服務(Websites)上,大約只花了 15 分鐘左右。

    在導入快取(cache)之後,程式的速度比起純用資料庫來說快了將近 100 倍,因為經常被存取的資料就可以直接從快取中取得,而不必再到資料庫中撈資料,如此一來你也可以降低資料庫的存取次數,讓資料查詢的動作變得更迅速。

    整合完畢的範例程式碼可以在這裡下載

    接下來我會說明我是如何把 Azure Redis Cache 整合進我的 ASP.NET MVC Movie 範例之中。

    1. 在預覽中新的 Azure 管理界面,我們可以如圖所示建立一個新的 Redis Cache 服務。

      建立 Cache 服務大概會花個 15 分鐘左右,不過同一時間我不會在這裡等著,而是去修改我的程式。如果你需要完整的參考手冊,可以參考 How to Use Azure Redis Cache 這篇文章,不過要記得的是,Redis Cache 服務必須要跟你的網站服務是在同樣的資料中心,不同的資料中心可能速度會相差到 25 倍左右,建立的步驟可以參考 Create a Redis Cache 這一頁,你可以下載原始的 MvcMovie 範例程來改,或是直接下載我修改後的範例,但是要記得修改 cache 服務的 URL 及認證資料才會正常運作。
    2. 當 Cache 服務建立完成後,記下 Cache 名稱像是 <yourName>.redis.cache.windows.net 以及密碼(點擊 keys 按鈕就可以取得名稱及密碼)。
    3. 在你的 MVC 專案中,使用 NuGet 套件管理工具安裝 StackExchange.Redis 這個套件,如果您下載的是修改後的範例,那專案中已經安裝並參考了這個套件。
    4. 打開套件管理主控台(package manager console)中輸入 Update-Database 的指令。
    5. 在相關的 controller 中加入連結快取服務的程式碼:
      public class MoviesController : Controller
         {
            private MovieDBContext db = newMovieDBContext();
            private static ConnectionMultiplexer connection;
            private static ConnectionMultiplexer Connection
            {
               get
               {
                  if (connection == null || !connection.IsConnected)
                  {
                     connection = ConnectionMultiplexer.Connect(
                     ".redis.cache.windows.net,ssl=true," +
                     "password=");
                  }
                  return connection;
               }
            }

    注意:一般來說都不建議你把帳號密碼的資料直接寫在程式碼中,這裡只是為了方便瞭解程式碼才這麼做。請參考 Windows Azure Web Sites: How Application Strings and Connection Strings Work 這篇文章介紹的方法來處理帳號密碼這些敏感資料。

    在上述的程式碼中,我已經將連結快取服務的部份用靜態成員的方式儲存,所以你不必在每一次 request 都重新建立一個快取服務的連結,你只需要在使用時檢查連結是否還在,若已經失去連結再重新建立連結就好。

    新增一個類別,並包含這個 SampleStackExchangeRedisExtension 類別:

    public static class SampleStackExchangeRedisExtensions
    {
       public static T Get<T>(this IDatabase cache, string key)
       {
          return Deserialize<T>(cache.StringGet(key));
       }
    
       public static object Get(this IDatabase cache, string key)
       {
          return Deserialize<object>(cache.StringGet(key));
       }
    
       public static void Set(this IDatabase cache, string key, object value)
       {
          cache.StringSet(key, Serialize(value));
       }
    
       static byte[] Serialize(object o)
       {
          if (o == null)
          {
             return null;
          }
          BinaryFormatter binaryFormatter = new BinaryFormatter();
          using (MemoryStream memoryStream = new MemoryStream())
          {
             binaryFormatter.Serialize(memoryStream, o);
             byte[] objectDataAsStream = memoryStream.ToArray();
             return objectDataAsStream;
          }
       }
    
       static T Deserialize<T>(byte[] stream)
       {
          BinaryFormatter binaryFormatter = new BinaryFormatter();
          if (stream == null)
             return default(T);
    
          using (MemoryStream memoryStream = new MemoryStream(stream))
          {
             T result = (T)binaryFormatter.Deserialize(memoryStream);
             return result;
          }
       }
    }

    SampleStackExchangeRedisExtensions 類別可以讓你很輕易就將任何可序列化(serializable)的類別做快取。你可以在你的模型(model)上加上 [Serializable] 屬性。

    [Serializable]
    public class Movie

    然後將所有 Movie movie = db.Movies.Find(id); 的部份都修改成:

    //Movie movie = db.Movies.Find(id);
    Movie movie = getMovie((int)id);

    在 POST 呼叫的 EditDelete 方法中,記得要清除快取。

    ClearMovieCache(movie.ID);

    在 controller 中加入下面這段程式碼,其中 getMovie 是一個很標準的快取操作:

    Movie getMovie(int id)
    {
       Stopwatch sw = Stopwatch.StartNew();
       IDatabase cache = Connection.GetDatabase();
       Movie m = (Movie)cache.Get(id.ToString()); 
    
       if (m == null)
       {
          Movie movie = db.Movies.Find(id);
          cache.Set(id.ToString(), movie);
          StopWatchMiss(sw);
          return movie;
       }
       StopWatchHit(sw); 
    
       return m;
    } 
    
    private void ClearMovieCache(int p)
    {
       IDatabase cache = connection.GetDatabase();
       if (cache.KeyExists(p.ToString()))
          cache.KeyDelete(p.ToString());
    } 
    
    void StopWatchEnd(Stopwatch sw, string msg)
    {
       sw.Stop();
       double ms = sw.ElapsedTicks / (Stopwatch.Frequency / (1000.0));
       ViewBag.cacheMsg = msg + ms.ToString() +
           ” PID: ” + Process.GetCurrentProcess().Id.ToString();
    } 
    
    void StopWatchMiss(Stopwatch sw)
    {
       StopWatchEnd(sw, “Miss – MS:”);
    } 
    
    void StopWatchHit(Stopwatch sw)
    {
       StopWatchEnd(sw, “Hit – MS:”);
    }

    另外,在 Views\Shared\_Layout.cshtml 檔案中加入 ViewBag.cacheMsg 的程式碼,這是為了在頁面上顯示快取的資訊。

    <div class="container body-content">
      @RenderBody()
      <hr />
      <footer>
        <h2>@ViewBag.cacheMsg</h2>
      </footer>
    </div>
    
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
    </body>
    </html>

    現在你可以在開發環境中測試快取的效果了,不過如果你的資料庫很小,而快取服務又是在雲端,效果可能不會太明顯,部署到 Azure 上應該就可以感受到明顯的差異。

    在管理介面中監控快取服務

    在管理介面中,你可以看到快取服務的 hit/miss 的統計資料:

    你可以加上其它的相關資訊來監控,像是自訂時間範圍、被清除的鍵值、過期的鍵值、使用的 CPU 或記憶體等。

    當然,你也可以加入警告通知(Add Alert)來幫助你監控快取服務的使用狀況,像是下圖我就加入了一個警告通知,在 15 分鐘內,清除的鍵值過多時,可能要使用更大的快取。

    從 Visual Studio 將網站部署到 Azure 是十分容易的,只要在 Web 專案上按右鍵,選擇發行就可以了,再次提醒,網站服務跟快取服務一定要在同一個資料中心,否則網路傳輸的延遲會拖垮快取的效能。而在發行時別忘了勾選 Execute Code First Migrations

    部署完成後,你就可以試試看有沒有快取的效能是不是有明顯的差異。

    壓力測試快取服務

    預設的快取操作時間是 1000ms (1秒),你可以試著用下面這段程式碼,將 time out (強制清除快取)改成更長或更短的時間,測試你的快取服務是否正常。當 #define NotTestingTimeOut 這段程式碼被註解掉時,timeout 便會被設定為 150ms,讓快取在很短的時間被清掉。

    #else
          #region StressTest
          private static ConnectionMultiplexer Connection
          {
    
             get
             {
                if (connection != null && connection.IsConnected)
                {
                   return connection;
                }
                var config = new ConfigurationOptions();
                config.EndPoints.Add(Keys.URL);
                config.Password = Keys.passwd;
                config.Ssl = true;
                config.SyncTimeout = 150;
    
                connection = ConnectionMultiplexer.Connect(config);
                return connection;
             }
          }
          #endregion
    #endif

    在壓力測試時,最好將 session 快取關閉,簡單的作法是到 web.config 檔案中把整個應用程式的 session 快取關閉。

    <sessionState mode="Off" />

    或是在你的 controller 中使用 [SessionState(SessionStateBehavior.Disabled)] 來做。以下這個更新後的 getMovie 方法可以運作得更穩定,因為當 time out 例外發生時會重試 3 次。

          Movie getMovie(int id, int retryAttempts = 0)
          {
             IDatabase cache = Connection.GetDatabase();
             if (retryAttempts > 3)
             {
                string error = "getMovie timeout with " + retryAttempts.ToString()
                   + " retry attempts. Movie ID = " + id.ToString();
                Logger(error);
    
                ViewBag.cacheMsg = error + " Fetch from DB";
                // Cache unavailable, get data from DB
                return db.Movies.Find(id);
             }
             Stopwatch sw = Stopwatch.StartNew();
             Movie m;
    
             try
             {
                m = (Movie)cache.Get(id.ToString());
             }
    
             catch (TimeoutException tx)
             {
                Logger("getMovie fail, ID = " + id.ToString(), tx);
                return getMovie(id, ++retryAttempts);
             }
    
             if (m == null)
             {
                Movie movie = db.Movies.Find(id);
                cache.Set(id.ToString(), movie);
                StopWatchMiss(sw);
                return movie;
             }
             StopWatchHit(sw);
    
             return m;
          }

    這個範例程式中還有很多方法可以測試快取服務。

    像 WriteCache 或 ReadCache 方法會預設寫入或讀取 1,000 筆資料,你可以在 URL 後加上 "/n" 讓它們變成讀寫 n * 1000 筆的資料,像上圖的例子 http://<your site>.azurewebsites.net/Movies/ReadCache/3 就會讀取 3,000 筆快取的資料。

    在這個 150ms timeout 的環境下,我的程式就會很容易碰到 timeout 的狀況而去存取資料庫,這是因為我的程式有正確處理這個 timeout 的例外才能順利去讀取資料庫。所以建議您上線的應用程式也要能處理好這個例外,因為根據雲端平台的服務水準,如果您選擇的是基本方案,那一個月中可能會有幾分鐘無法存取(比如正在更新 VM),除非選擇了標準方案,並且建立好 master-slave 的架構備援,不過還是建議您在程式碼中預先處理這個可能發生的例外狀況。

    Azure Redis Cache (Preview) ASP.NET Session State Provider

    ASP.NET 預設的 In-memory Session State Provider 無法同時被多個網站實體使用,而 SQL Server session state 雖然可以同時讓不同的網站使用相同的 session state,但這會受限於資料庫查詢的延遲時間,進而影響效能。而 Redis session state cache provider 則是另一個選擇,如果你的網站只會用到不是很大的 session state,則可以利用 Redis Cache 來快取這些 session state data。

    您可以參考這篇文章,在你的網站應用程式中加入 RedisSessionStateProvider,然後修改 Web.config 檔案來設定 Redis Cache 服務:

     <system.web>
         <customErrors mode="Off" />
         <!--<sessionState mode="Off" />-->
        <authentication mode="None" />
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
      <sessionState mode="Custom" customProvider="RedisSessionProvider">
                   <add name="RedisSessionProvider" 
                  type="Microsoft.Web.Redis.RedisSessionStateProvider" 
                  port="6380"
                  host="movie2.redis.cache.windows.net" 
                  accessKey="m7PNV60CrvKpLqMUxosC3dSe6kx9nQ6jP5del8TmADk=" 
                  ssl="true" />
          <!--<add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="127.0.0.1" accessKey="" ssl="false" />-->
          </providers>
        </sessionState>
      </system.web>
      <system.webServer>

    如此一來你就可以在你的網站應用程式中使用 Redis Cache 來處理 session state。在範例程式中也提供了測試的方法,你可以透過 http://<your site>.azurewebsites.net/SessionTest/WriteSession/Hello_joe 來存取,如此便會將 "Hello_joe" 寫入 session state,你可以試著增加網站服務實體,看看這個 session state 是否會在多個實體間共用。

    如果你對於 Redis Cache 有任何問題,可以在 twitter 上跟隨 @RickAndMSFT 並且向他發問。

    參考資料

  • 我該選擇哪一種 Azure 的分散式快取 (Cache) 方案?

    本文主要內容譯自 http://msdn.microsoft.com/en-us/library/azure/dn766201.aspx

    在2014年5月12日,微軟宣布 Azure Redis Cache (技術預覽) 開始提供用戶測試使用。微軟公司建議 Azure 用戶所有的新開發的應用系統,未來皆採用 Azure Redis Cache。Azure Redis Cache 提供用戶一個由微軟管理,安全,專用的 Redis 快取服務。Microsoft Azure 提供了這項服務之後,用戶開始可以充分利用 Redis 目前在業界既有的生態系統與豐富的功能,並透過微軟穩定地營運與監管。

    Redis

    不同於只能使用 Key-Value 成對式的傳統的快取,Redis 之所以流行是因其具有多樣化且高效能之資料型別,Redis 所支援的各種資料型別可參閱 http://redis.io/topics/data-types。 Redis 也支援這些資料型別的運算操作 (atomic operation),例如用戶可以附加文字到一個 String; 可以遞增 Hash ; 可以推送一個資料至 List ; 可以計算兩個 Set 之間是否有交集的字串,差異的字串,與聯集的字串; 或是在 Sorted sets 內找到一個排序最高的成員。其他功能還包括支援運算不可部分完成的交易 (Transaction) ,發布/訂閱模式,Lua scripting,以及使 Redis 的表現更像一些傳統快取服務的相關功能,例如在 : 特定時間內 (time-to-live) 有效的 Key-Value 之配置與設置。

    另一個重要的原因,是因為 Redis 週邊已經成功建立了一健康,充滿活力的開放原始程式碼之生態系統。能夠提供跨多種程式語言之 Redis client 用戶端環境,這使得 Microsoft Azure 內的現有用戶,無倫使用何種作業系統或程式語言都可以適用。對於 Microsoft ASP.NET 的用戶而言,Azure Redis Cache 亦提供了 ASP.NET Session State Provider,可參閱 http://msdn.microsoft.com/en-us/library/azure/dn690522.aspx 步驟進行設定。如何取的 Redis Client Library for Microsoft .NET 可參閱 http://msdn.microsoft.com/en-us/library/azure/dn690471.aspx

    目前 Microsoft Azure Redis 的高速快取服務雖尚在技術預覽階段,目前在快取容量可達 26 GB。預計在 2014 年底前此服務即會正式推出,屆時 Microsoft Azure Redis 將會支援超過 26 GB 的快取容量,並提供 99.9% 不停機的高可用性服務水準合約 (SLA)。

    而目前既有的 Azure Managed Cache Service 同樣提供了 99.9% 高可用性服務水準合約 (SLA)。如果你是一個現有的 Azure Managed Cache Service 客戶,你仍可以繼續使用現有的服務或選擇未來遷移到 Microsoft Azure Redis ,以享用 Redis 所提供的各類新功能。同樣如果你是現有 Azure In-Role Cache 的客戶,你仍可以繼續使用現有的服務或選擇未來遷移到 Microsoft Azure Redis 以享用Redis 所提供的各類新功能。對於 Azure Shared Cache 的客戶,請注意 Azure Shared Cache 將於 2014年 9月1日終止服務,您應該盡快移植現有應用系統至其他快取服務,對於 Azure Shared Cache 移植相關指引文件可參閱: Migrate from Shared Caching.