亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

事件流變換的制作方法

文檔序號:11162171閱讀:612來源:國知局
事件是與一個或多個時間戳相關(guān)聯(lián)的一段數(shù)據(jù)。事件流是事件的流。事件源可以接收事件,按照時間戳對它們排序,并提供有序的事件流。存在用于處理事件流的各種常規(guī)機制。每個都涉及對事件流的變換的表達和執(zhí)行。然而,由于并行處理和事件的異步性質(zhì),流域自然是復雜的。因此,新用戶針對事件流進行查詢的學習曲線通常是非常陡峭的。目前,在事件處理中表示數(shù)據(jù)變換有兩種主要方法:域特定語言(DSL)和通用編程語言(GPPL)。DSL通常采用某種形式的類SQL語言,其具有處理時間維度的附加能力。DSL提供了以高度抽象描述查詢的聲明性方式。此外,DSL類似于SQL,以幫助減少學習曲線,并且使得甚至非開發(fā)人員能夠編寫查詢。DSL的主要問題是用戶定義的擴展和與應用的集成的困難,與應用程序的集成通常以GPPL被編寫。直接以GPPL編寫查詢可以使得能夠更順利地與使用數(shù)據(jù)的應用集成,但需要作者知道GPPL。在這里所要求保護的主題不限于解決任何缺點或僅在諸如上述的那些之類的環(huán)境中操作的實施例。而是,提供該背景僅是為了說明其中可以實踐在這里所描述的一些實施例的一個示例性
技術(shù)領域
:。技術(shù)實現(xiàn)要素:在這里所描述的至少一些實施例涉及制定對一個或多個輸入事件流的變換以生成一個或多個輸出事件流。因此,變換可以被認為是對一個或多個原始輸入事件流的查詢。事件查詢包括表示在特定執(zhí)行上下文中可用的輸入事件流的事件流源表示。事件查詢還包括標識要對執(zhí)行上下文中的輸入事件流執(zhí)行的變換集的變換模塊。一旦查詢被正確地形成,執(zhí)行模塊然后就可以使得對一個或多個指定的輸入事件流執(zhí)行變換以生成輸出事件流。在一些實施例中,可用于表達輸入事件流的編程抽象是相同的,而無論輸入事件流如何。例如,相同的編程抽象可以用于指定當代事件流以及歷史事件流。編程抽象可以允許將當代事件流與同一事件流的歷史版本結(jié)合。提供本
發(fā)明內(nèi)容以便以簡化形式介紹將在以下詳細描述中進一步描述的一些概念。這一
發(fā)明內(nèi)容并不旨在標識所要求保護的主題的關(guān)鍵特征或必要特征,也并不旨在用于幫助確定所要求保護的主題的范圍。附圖說明為了描述可以獲得本發(fā)明的上述和其他優(yōu)點和特征的方式,將通過參考在附圖中被圖示的其特定實施例來呈現(xiàn)對在上面簡要描述的本發(fā)明的更具體的描述。應當理解,這些附圖僅描繪了本發(fā)明的典型實施例,并且因此不應被認為是對其范圍的限制,將通過使用附圖、利用附加特征和細節(jié)來描述和說明本發(fā)明,在附圖中:圖1圖示了示出模型的創(chuàng)作環(huán)境方面的事件處理編程模型;圖2圖示了示出模型的執(zhí)行環(huán)境方面的事件處理編程模型;圖3圖示了用于使得變換組件準備以用于執(zhí)行環(huán)境中的操作的方法的流程圖;圖4圖示了圖示變換過程的流程圖。圖5圖示了被認為是在10分鐘的滾動窗口上的平均值的事件流;圖6圖示了與兩個事件流(一個當代和一個歷史)的結(jié)合相關(guān)聯(lián)的事件流;以及圖7圖示了在這里所描述的原理所可以操作于的示例計算系統(tǒng)。具體實施方式在這里描述了一種全面但易于使用的事件處理編程模型,其中可以對一個或多個事件流表達和執(zhí)行查詢,以由此產(chǎn)生一個或多個作為結(jié)果的事件流。事件是與一個或多個時間戳相關(guān)聯(lián)的一段數(shù)據(jù)。在這里所描述的至少一些實施例涉及制定對一個或多個輸入事件流的變換以生成一個或多個輸出事件流。因此,變換可以被認為是對一個或多個原始輸入事件流的查詢。事件查詢包括表示在特定執(zhí)行上下文中可用的輸入事件流的事件流源表示。事件查詢還包括標識要對執(zhí)行上下文中的輸入事件流執(zhí)行的變換集的變換模塊。一旦查詢被正確地形成,執(zhí)行模塊然后就可以使得對一個或多個指定的輸入事件流執(zhí)行變換以生成輸出事件流。在一些實施例中,可用于表達輸入事件流的編程抽象是相同的,而無論輸入事件流如何。例如,相同的編程抽象可以用于指定當代(例如,實況)事件流以及歷史事件流,甚至可能在同一查詢中??紤]以自然語言被表達的以下查詢:“當一天時間范圍中的平均能量消耗比一年前同一天消耗的能量高50%時觸發(fā)警報”。傳統(tǒng)上,這樣的情形通過用戶編寫復雜的定制邏輯而被解決。編程抽象可允許將當代事件流與同一事件流的歷史版本結(jié)合。因此,描述了對事件流的類型不可知(agnostic)的統(tǒng)一事件查詢模型(只要事件流在執(zhí)行上下文中可用)。對事件流查詢變換集進行編程的經(jīng)驗可以基本上相同,而與執(zhí)行上下文無關(guān)(例如,無論執(zhí)行上下文是在本地計算系統(tǒng)上、在遠程服務器上還是在云中)。執(zhí)行上下文使用上下文標識來獲得標識執(zhí)行上下文的必要信息,并使得查詢變換集在指定的執(zhí)行上下文中被運行。在執(zhí)行事件查詢處理之處的這種靈活性允許計算與生成一個或多個輸入事件流的地方和/或消耗一個或多個輸出事件流的地方更靠近地發(fā)生。因此,事件處理編程模型的實施例對執(zhí)行上下文是不可知的(只要執(zhí)行模塊具有足夠的信息來在該執(zhí)行上下文中標識和部署查詢)。在這里描述的事件處理模型的實施例具有對用戶的漸進學習曲線,同時仍然是表達性的和可擴展的。由于并行處理和事件的異步性質(zhì),流域自然是復雜的。因此,新用戶針對事件流進行查詢的學習曲線通常是非常陡峭的。為了易于使用,事件處理編程模型限制了用戶所暴露于的應用程序接口(API)中的概念/抽象的數(shù)量,并且清楚地定義了這樣的抽象的語義。同時,為了實現(xiàn)可表達性,這些抽象是可組合的,并且允許用戶從原始內(nèi)置事件處理計算構(gòu)建更高級的查詢邏輯。所描述的事件處理編程模型定義了可以按照域特定語言(DSL)和通用編程語言(GPPL)被表示的抽象。事件處理編程模型被描述為實現(xiàn)用于事件流的時間模型。在下面描述的應用程序接口(API)中,每個事件具有表示事件何時被生成的相關(guān)聯(lián)的單個時間戳。然而,在這里描述的更一般的原理還可以支持序列模型、間隔/快照模型或任何其他事件處理時間模型。在這里所描述的原理還可以可適用于允許在事件處理時間模型之間的清晰定義的用戶體驗間隔的情況下與多個事件處理時間模型(諸如時間模型、間隔/快照模型等)的交互的事件處理編程模型。事件處理編程模型還明確地定義時間的概念并且在虛擬時間(即,應用時間)中工作。許多監(jiān)視和遙測情形涉及對具有與掛鐘時間(即,系統(tǒng)時間)不同的其自己的時間線的日志記錄的分析。這是自然語言形式的這樣的查詢的一個示例:“當在一小時時間范圍內(nèi)沒有響應時提醒所有情況”。這樣的查詢不涉及對系統(tǒng)時間的評估。事件處理編程模型通過以它們可以被運行查詢的底層服務自動并行化的方式定義事件處理計算來提供可表達性。因此,事件處理編程模型可以通過提供方便的分組抽象來彈性地橫向擴展計算。首先,將介紹時間數(shù)據(jù)處理模型的概念??紤]以下情形。假設存在從數(shù)據(jù)中心中的不同機器獲取的一組性能計數(shù)器值。在這種情形下,系統(tǒng)將發(fā)現(xiàn)性能計數(shù)器值隨時間的異常。性能計數(shù)器值的時間是讀取該值時的時間,而不是處理對應的事件時的時間。因此,事件處理編程模型引入時間模型。這一時間模型基于虛擬時間,并且被建立在復雜事件檢測和響應(CEDR)代數(shù)的子集上并且基于虛擬時間。時間模型中的所有運算符都指的是每個事件中的虛擬時間時間戳。在一個實施例中,為了簡化用于用戶的語義,時間模型中的事件是點事件,因為事件各自具有恰好一個時間戳并且攜帶用于一個時間點的有效載荷。點事件的示例包括儀表讀取、電子郵件的到達、用戶Web點擊、股票報價或?qū)θ罩镜匿浫?。這一時間模型中的所有運算符可以是確定性的,并且運算符的輸出可以是可重復的。在一個示例中,查詢接收被稱為源的事件流作為其輸入,使用該事件流輸入執(zhí)行變換(例如,過濾、選擇等等)(即,對該輸入事件流執(zhí)行查詢),并生成被稱為宿(sink)的作為結(jié)果的數(shù)據(jù)流。源從各個位置接收各種事件,并且提供作為結(jié)果的事件流。在一些實施例中,源還可以對事件執(zhí)行更多一些以產(chǎn)生事件流,諸如按時間上的時間對事件排序。圖1圖示了示出模型的創(chuàng)作環(huán)境100方面的事件處理編程模型。創(chuàng)作模塊141允許作者創(chuàng)作事件流源表示110、事件流宿表示120、變換模塊130和上下文標識模塊150。在創(chuàng)作之后,發(fā)起命令160可以被發(fā)起,其自動地使得在上下文標識模塊150中標識的執(zhí)行上下文中執(zhí)行變換模塊130。例如,圖2圖示了在執(zhí)行環(huán)境200中執(zhí)行的可執(zhí)行變換組件230。查詢變換模塊130表示要對輸入事件流執(zhí)行以由此生成輸出(或作為結(jié)果的)事件流的特定查詢。具體地,查詢變換模塊130可以表示要對一個或多個輸入事件流執(zhí)行以由此生成一個或多個輸出事件流的一個或多個變換的變換集。變換操作的示例可包括對一個或多個事件流源中的每個事件流源進行過濾以使得僅允許事件中的一些事件通過。其他變換可包括使用事件流源事件而被執(zhí)行以由此生成一個或多個作為結(jié)果的事件的邏輯。這樣的邏輯可以直接對事件流源執(zhí)行,或者僅對通過一個或多個過濾器而被過濾的事件執(zhí)行。在執(zhí)行環(huán)境中,對應的查詢變換組件230接收事件流源210作為輸入。事件流源210接收事件201(諸如如由橢圓201D表示的潛在的許多其它當中的事件201A、201B、201C),并提供結(jié)果作為輸入事件流211。查詢變換組件230處理輸入事件流以由此執(zhí)行在查詢變換模塊130中表示的查詢。作為處理的結(jié)果,查詢變換組件230生成被提供給事件流宿220的輸出(作為結(jié)果的)事件流221。輸出事件流221表示當查詢被應用于輸入事件流211時與查詢變換組件相關(guān)聯(lián)的查詢的查詢結(jié)果。事件流源210和事件流宿220自身可以被認為是事件流。因此,事件流宿可以稍后用作用于筆筒的查詢處理的事件流源。在創(chuàng)作時,作者使用創(chuàng)作模塊141來制定表示在執(zhí)行上下文200中可用的事件流源210的事件流源表示110。創(chuàng)作模塊141還用于制定查詢變換模塊,查詢變換模塊標識要對由變換模塊表示(或與變換模塊相關(guān)聯(lián))的一個或多個輸入事件流執(zhí)行的一個或多個變換130的變換集。變換模塊130可以引用事件流源表示110或者與事件流源表示110相關(guān)聯(lián)。創(chuàng)作模塊141還可以用于制定表示在執(zhí)行上下文200中可用的事件流宿220的事件流宿表示120。變換模塊130可以引用事件流宿表示120或可以與事件流宿表示120相關(guān)聯(lián)。創(chuàng)作模塊141還可以用于制定標識執(zhí)行上下文的上下文標識模塊150。執(zhí)行上下文150包含用于在上下文中可用的事件流源和事件流宿的定義。通過擴展,可用操作的集合也可以從可用的源和宿定義被推斷。例如,如圖2中所示,執(zhí)行上下文200包括事件流源110的實例210,以及事件流宿120的實例220。上下文標識模塊150可以隱式地標識上下文(例如,在沒有明示上下文標識的情況下作為缺省上下文),或者明確地標識上下文。例如,缺省上下文可以簡單地僅是在發(fā)起查詢的同一系統(tǒng)上執(zhí)行查詢變換組件130的實例。僅作為示例,執(zhí)行上下文可以是本地計算系統(tǒng)、云計算環(huán)境或任何其他執(zhí)行環(huán)境。創(chuàng)作環(huán)境100還包括執(zhí)行模塊161,其在檢測到一個或多個條件和/或事件時解譯變換模塊130以促進對應的查詢變換組件230在執(zhí)行上下文200中被執(zhí)行。例如,執(zhí)行模塊161可以包括被配置為在檢測到用戶輸入時發(fā)起執(zhí)行模塊161的發(fā)起命令或控件160(或“管理API”)。發(fā)起命令160自動地使得事件處理編程模型在執(zhí)行上下文200中被運行。例如,如果在內(nèi)容標識組件150中標識的上下文指示查詢將在本地被運行,則查詢變換組件230可以在本地計算系統(tǒng)上在本地被運行。如果在上下文標識組件150中標識的執(zhí)行上下文是云計算環(huán)境或某種類型的遠程服務器,則查詢變換模塊130將被上傳到該云計算環(huán)境或其他類型的遠程服務器,實例化查詢變換組件230并且然后在該遠程環(huán)境中被運行。注意,其中運行查詢變換組件130的實例230的上下文可以在上下文標識組件150內(nèi)被標識,而不改變查詢變換組件130自身的任何查詢邏輯。圖3圖示了用于使得變換組件230準備以用于執(zhí)行環(huán)境200中的操作的方法300的流程圖??梢皂憫谧髡甙l(fā)起圖1的發(fā)起命令160來執(zhí)行方法300。事件流源表示被訪問(動作301A)。例如,在圖1中,事件流源表示110被訪問。對僅一個事件流源表示沒有限制。因此,另一事件流源呈現(xiàn)可被訪問(動作301B)。另一事件流源表示還表示在執(zhí)行上下文200中可用的特定事件流(盡管未在圖2中示出)。作為一個示例,事件流源110可以是當代事件流,而附加事件流源(未示出)可以是歷史事件流。變換可包括執(zhí)行輸入當代事件流的歷史時移版本。變換模塊也被訪問(動作302)。例如,在圖1中,變換模塊130可被訪問。事件流宿表示也與上下文標識組件(動作304)一起被訪問(動作303)。例如,執(zhí)行模塊161可以訪問變換模塊130、事件流宿表示120和上下文標識組件150。然后,執(zhí)行模塊解譯(動作310)變換模塊,以使得在執(zhí)行上下文200中對標識的一個或多個輸入事件流執(zhí)行變換集以生成作為結(jié)果的事件流。為此,執(zhí)行模塊161使用上下文標識模塊150內(nèi)的上下文標識。例如,執(zhí)行模塊獲得變換組件的實例(動作311),諸如變換組件230。執(zhí)行模塊還將變換組件耦合到由事件流源表示(諸如事件流源表示110)標識的任何事件流源(動作312)(諸如事件流源210)。執(zhí)行模塊還將變換組件耦合到由事件流源表示(諸如事件流源表示120)標識的任何事件流宿(動作313)(諸如事件流宿220)。變換組件230然后可被執(zhí)行(動作314)?;氐綀D1,創(chuàng)作模塊141包括編程抽象的集合140,其可被作者用來制定事件流源表示110、事件流宿表示120、查詢變換模塊130和上下文標識組件150。例如,抽象140被圖示為包括抽象141至144,但是省略號145表示可以存在由程序員用來創(chuàng)作模塊事件流表示110和120以及模塊130和150的任何數(shù)量的抽象。在這里所描述的實施例中,可能除了僅在對事件流源110本身的標識中,和/或除了僅在對事件流宿120本身的標識中,在沒有對查詢變換模塊130的任何基本改變的情況下,可以改變事件流源110和事件流宿120的身份和類型。例如,在圖1的示例中,抽象140之一可以用于標識事件流源(諸如事件流源110)。以下是被稱為ITemporalSourceDefinition接口的抽象的示例。當然,在這里描述的特定抽象的任何名稱是任意的。更重要的是抽象的功能。以下是使用ITemporalSourceDefinition接口的示例HTTP源定義:時間源(諸如剛剛定義的HTTP源)產(chǎn)生按虛擬時間排序的事件。它們可以具有一些特定的參數(shù),這取決于源的類型。例如,在某些類型的時間事件流源中,隊列名稱可能具有相關(guān)性。其他類型的時間事件流源可能具有時間戳選擇或分組鍵選擇符。在分布式情形中,事件流源(例如,事件流源210)可能無序地接收事件(例如,事件201)。事件流源跟蹤虛擬時間。當事件被接收到時,事件流源確定與事件相關(guān)聯(lián)的點時間,并相應地使應用時間前進。然而,由于事件有時無序地到達,具有當前應用時間之前的時間戳的一些事件可以到達事件流源。換句話說,在過去通過推算虛擬時間對事件加上時間戳。想象以下情況:存在具有時間戳T1、T2和T3的三個事件。根據(jù)應用時間推算,時間戳T1在時間戳T3之前的時間戳T2之前。如果事件采用到事件流源的不同路由,則事件可能到達,從而使得具有時間戳T1和T3的事件首先到達,并且僅在此之后,具有時間戳T2的事件到達。如果事件流源在具有時間戳T3的事件到達時將虛擬時間移動到T3—不清楚對具有時間戳T2的事件該做什么。存在時間事件流源的兩個參數(shù)幫助用戶應對事件無序地到達的問題。一個參數(shù)是無序策略,其可以是“調(diào)整”或“丟棄”。如果應用調(diào)整策略,則具有小于當前虛擬時間的時間戳的所有事件將被用當前虛擬時間重新加時間戳。在應用丟棄策略時,所有這樣的事件將被丟棄。然而,事件流源可能施加其他類型的無序策略。另一無序策略的示例是“中止”策略,其中無序到達的事件使得對作為結(jié)果的事件流的查詢被中止。使得能夠容忍無序事件的另一參數(shù)是標點生成設置。它們定義服務應如何推進輸入的虛擬時間。在事件無序地到來但用戶不想用無序策略對其重新加時間戳的情況下,用戶可以顯式地設置如何使用前進虛擬時間函數(shù)來在源上生成標點。前進虛擬時間函數(shù)將當前虛擬時間和所有被緩沖事件的列表作為輸入,并返回新的虛擬時間。例如,為了在虛擬時間中容忍10秒的延遲,用戶可以提供以下函數(shù):抽象140的另一示例是用于標識和潛在地定義作為結(jié)果的事件流所將去往的事件流宿221的抽象。在這里的示例中,這樣的抽象被稱為ITemporalSinkDefinition接口。以下是使用ITemporalSinkDefinition接口的事件流宿定義的樣本:與查詢變換模塊130本身相關(guān)聯(lián)的查詢可以使用將查詢變換模塊130與事件流源110相關(guān)聯(lián)的抽象而被定義,從而使得當查詢變換組件130的實例230被執(zhí)行時,實例接收輸入來自對應的事件流源210的輸入事件流211??梢杂糜谶@樣做的抽象140的一個示例在這里被稱為“From(來自)”方法。與查詢變換模塊130相關(guān)聯(lián)的查詢也可以使用將查詢變換組件230與事件流宿210相關(guān)聯(lián)的抽象而被定義,從而使得當查詢變換組件230的實例被執(zhí)行時,實例將輸出事件流221提供給對應的事件流宿220。可以用于這樣做的抽象140的一個示例在這里被稱為“To(去往)”方法。以下是示例端到端查詢,其使用各種抽象140來定義事件源、定義事件流宿、定義查詢邏輯以及將查詢邏輯連接到定義的事件源和事件宿。在這一示例中,事件流源是HTTP源,并且查詢邏輯涉及計算每臺機器的平均CPU使用率:在這里描述的事件處理編程模型允許它的用戶表達對數(shù)據(jù)的低延時、增量的、縮放的和可靠的計算?,F(xiàn)在將描述數(shù)據(jù)的處理和數(shù)據(jù)的計算。如上所述,數(shù)據(jù)被組織成事件流。每個事件流描述隨時間推移而附加的數(shù)據(jù)的潛在無限集合。例如,每個事件由數(shù)據(jù)和相關(guān)聯(lián)的時間戳組成。對數(shù)據(jù)的計算由查詢表示,其可以被表示為圖。因此,當用戶定義查詢時,用戶使用基本構(gòu)造塊(例如,事件源和宿定義)來定義數(shù)據(jù)變換的圖結(jié)構(gòu),并且還定義相關(guān)聯(lián)的變換本身。這樣的查詢定義可以被聲明性地執(zhí)行。例如,圖4圖示了流程圖,該流程圖圖示了變換過程的。在圖4中,用戶取得性能計數(shù)器源定義,應用過濾器(“where(其中)”)變換和選擇變換,并將所有內(nèi)容輸出到隊列中。當這一圖被提交給適當上下文(如由上下文標識組件150所標識的)以用于執(zhí)行(例如,通過發(fā)起命令160的執(zhí)行)時,該圖在用于計算的服務內(nèi)被執(zhí)行。服務解譯該圖以在運行時執(zhí)行該圖。服務從性能計數(shù)器取得運行時數(shù)據(jù),對其進行過濾和投影并輸出給隊列。這一圖的運行時實例化是查詢。因此,事件處理編程模型由映射到運行時實體的定義實體組成。定義實體用于聲明性地描述數(shù)據(jù)流和在它們上的計算。這些概念只定義行為—它們不具有任何運行時成分。例如,“filter(過濾器)”的定義規(guī)定傳入數(shù)據(jù)將根據(jù)某些謂詞被過濾。為了比你編程語言,定義類似于類。查詢的組成在客戶端側(cè)上使用事件處理編程模型發(fā)生,但是在事件處理引擎上執(zhí)行查詢的實際實例化和執(zhí)行(其可以是任何方式和在任何設備上)。因此,運行時實體是實現(xiàn)定義的運行的實例。運行時實體由事件處理引擎或服務托管和執(zhí)行,并且進行數(shù)據(jù)的實際處理。它們類似于編程語言中的對象。例如,在運行時期間,存在事件流源110的一個實例在操作,查詢變換鏈130的一個實例在操作,以及事件流宿130一個實例在操作。這一描述現(xiàn)在將提供可以如何實現(xiàn)事件處理編程模型以使用C#編程語言進行示例查詢的示例。在這一示例中,假設存在一個HTTP端點,其中來自房間的所有傳感器發(fā)送它們的當前溫度。在這一情形下,如果來自任何傳感器的1分鐘的窗口內(nèi)的平均溫度超過90攝氏度,則應用應產(chǎn)生報警。另外,警報應被寫入Azure隊列中。以下是查詢的對應的C#示例,其描述查詢邏輯、要被使用的事件流源、要被使用的事件流宿、查詢將被運行于的上下文以及對應的發(fā)起命令。提供行編號和適當?shù)目崭褚杂糜诤罄m(xù)的參考和組織。在這一該示例中,以五個邏輯步驟實現(xiàn)查詢。在行1中,標識查詢要被運行在其中的上下文。這是圖1的上下文標識組件150的示例。在這一示例中,使用ServiceContext方法來獲得上下文,該方法表示圖1的抽象140的示例。在行2中,事件流源被定義。在這一示例中,事件流源是HTTP事件流源。然而,事件處理引擎可能能夠處理各種各樣的事件流源。因此,抽象140可包括對不同的事件流源類型的內(nèi)置支持。當定義源時,用戶可以對事件類型(在這種情況下為溫度)進行選擇??梢源嬖谔囟ㄓ诰唧w源類型的一些其他參數(shù)(在該示例中為ingressUri)。行2的調(diào)用中的最后參數(shù)是分組標準,其是圖1的抽象140的另一示例。查詢可以使用如由某個鍵標識的這樣的分組標準,因此在查詢中被定義的所有操作將被分別應用于群組的每個成員。在上面的示例中,查詢按照SensorId被分組。這意味著average(平均)/where(其中)/select(選擇)操作(行5-10)將被獨立地應用于來自每個傳感器的數(shù)據(jù)。行2是圖1的事件流源110的示例。在行3-4中,事件流宿被定義。事件流宿定義輸出數(shù)據(jù)(例如,輸出事件流)將在哪里結(jié)束。在上面的示例中,行3-4指定將把數(shù)據(jù)寫入Azure隊列中的宿。行3-4是圖1的事件流宿120的示例。在行5-10中,存在查詢邏輯本身,其將數(shù)據(jù)從源變換到宿。查詢包括彼此組合的不同源/宿定義。在該示例中,首先計算1分鐘的窗口內(nèi)的平均值。之后,溫度高于90度的所有事件被濾過。對于任何這樣的事件,使用“select”變換來創(chuàng)建報警。行5-10是圖1的查詢變換組件130的示例。在行11中,在事件處理服務(行11)內(nèi)運行查詢。最后操作將在事件處理服務中創(chuàng)建具有指定名稱的查詢的運行的實例。為了向服務提交查詢,用戶使用在行1中獲取的服務上下文。因此,行11是圖1的發(fā)起命令160的示例。即使該示例以C#被給出,但是事件處理編程模型可以是語言不可知的。例如,模型可以提供按照不同語言(包括C#、JavaScript等)的SDK。在先前部分中介紹的事件源定義的概念允許事件處理編程模型統(tǒng)一實況數(shù)據(jù)和歷史數(shù)據(jù)以及源于設備的數(shù)據(jù)和源于云的數(shù)據(jù)之間的體驗。從編程模型的角度來看,數(shù)據(jù)是在運行時生成(如在HttpSource的情況下)還是從表中取得(如在AzureTableSource的情況下)沒有區(qū)別—它是具體源定義的細節(jié)。源于設備和源于云的定義也是如此。統(tǒng)一不同類型的數(shù)據(jù)源,編程模型允許用戶專注于查詢的業(yè)務邏輯,其即使在數(shù)據(jù)源將來會改變的情況下也保持不變。例如,在圖1中,用戶可以集中于創(chuàng)作查詢變換組件130,而基本抽象140可以用于允許用戶定義適當?shù)脑?、宿和上下文標識?;氐角懊娴那樾?,代替創(chuàng)建HTTP源(上面的示例中的行2),并且代替將所有數(shù)據(jù)推送給云并且在那里分析它(上面的示例中的行1和11),用戶可以使用將在設備上被實例化的內(nèi)置設備源定義(例如,下面示例的行1中的service.GetDeviceSource)。代碼的示例可能如下:數(shù)據(jù)變換邏輯(行-10)根本沒有改變。只存在兩個主要的差別。首先,行1的源定義已經(jīng)稍微改變(與先前示例的行2相比),以將源標識為對設備可用的。其次,移除了先前示例的行1,從而導致在缺省上下文(例如,在對設備可用的事件處理服務上)中執(zhí)行行10的發(fā)起命令。服務本身然后可以決定如何更好地分發(fā)和執(zhí)行查詢。對于上面的示例,假設平均值的計算、對溫度的過濾和報警的生成可以在設備上發(fā)生,同時僅在必要時將報警事件傳播到云。以相同的方式,查詢計算的一些部分可以被推送給表示關(guān)系數(shù)據(jù)庫、映射/減少執(zhí)行引擎等的源定義。事件處理編程模型原理和API這一節(jié)討論事件處理編程模型背后的主要原理,并更詳細地介紹示例應用程序接口的元素。對于在虛擬時間中操作的事件計算,應當存在將應用時間向前移動的方式。通常,在事件處理引擎中,虛擬時間的前進由被稱為標點的特殊事件來傳達。在查詢處理期間,虛擬時間由標點事件驅(qū)動。它們用于通過向服務告知時間線的某些部分對于這一特定輸入將不再改變來提交事件并將計算出的結(jié)果發(fā)布給查詢輸出:通過在時間T處使標點入列,輸入承諾不產(chǎn)生將影響T之前的時段的任何后續(xù)事件這。這意味著,在標點在輸入中已經(jīng)入列之后,所有其他事件的虛擬時間應不小于入列的標點。這一規(guī)則的違反被稱為“標點違規(guī)”。可以存在不同的策略來處理標點違規(guī)(即,丟棄事件、中止查詢或調(diào)整事件時間)。在事件處理編程模型中,所有事件也可以被認為是標點,因此用戶不必顯式地將標點插入到數(shù)據(jù)流中。然而,在一些情況下仍然可以使用標點,諸如當用戶想要沖刷有狀態(tài)的運算符的當前狀態(tài)時。例如,考慮圖5的以下示例,其中考慮在10分鐘的滾動窗口中的平均值。在圖5中,在運算符看到具有屬于時段T2的虛擬時間的下一事件之前,不允許運算符為時段T1產(chǎn)生任何輸出。如果事件不是均勻分布的并且新事件僅在時段T2結(jié)束時到來,則這可能導致長等待時間。為了應對這種情況,用戶可以發(fā)出向前移動時間的標點符號,并允許運算符關(guān)閉當前窗口(右圖)。除了移動虛擬時間之外,還可能存在其他類型的標點,諸如“出錯”和“完成”標點。如果在事件處理期間發(fā)生錯誤,則將“出錯”標點傳送給下游運算符。當預計不再有此輸入的事件時,發(fā)出“完成”。事件處理編程模型在運算符中提供可重復性。如果對于相同的初始狀態(tài)和相同的輸入,運算符確定性地產(chǎn)生相同的輸出,則運算符是可重復的。非重復性有兩個主要原因:運算符的非確定性和不能提供相等的輸入(如在取決于物理時間的運算符的情況下,諸如定時器)。非確定性運算符可以被進一步細分為內(nèi)在非確定性的運算符(它們的狀態(tài)取決于某種形式的隨機函數(shù)/外部改變狀態(tài))和輸入非確定性的運算符(輸出取決于不同輸入之間的事件的次序)的運算符。分組事件處理編程模型使用分組的概念來提供事件處理計算的彈性縮放。例如,以下查詢使用分組:事件處理編程模型中的事件流可以使用用戶指定的分組鍵被細分為不相交的組。因此,每個事件流是一組子流,每個鍵的唯一值一個。查詢中的所有運算符被獨立地應用于每個子流,并且不共享狀態(tài)。在上面的查詢中,用戶將接收用于每個子流的獨立結(jié)果——例如,每個機器每個五分鐘時間窗口的一個平均CPU使用值。在這一示例中,分組的概念由在這里被稱為RegroupBy運算符的抽象140之一的示例公開,RegroupBy運算符采用鍵選擇符作為參數(shù)。如果未指定組標準,則可將數(shù)據(jù)流視為包含所有事件的單個邏輯組。為了方便起見,一些事件流源還可以將組函數(shù)作為參數(shù)。以下是這樣的事件流源定義的示例:vartable=service.GetAzureTableSource<int,CpuReading>(…,e=>e.MachineId);為了對所有事件進行操作,用戶可以利用返回常數(shù)的鍵選擇符對數(shù)據(jù)流重新分組。示例API在這一部分中,詳細描述了主API構(gòu)造元素(其是圖1的抽象140的每個示例)的示例。也就是說,這只是示例。定義實體概要源:定義用于產(chǎn)生事件流的機制或計算。例如,HTTPSourceDefinition定義了一種用來根據(jù)被發(fā)送給特定HTTPURL的所有請求來創(chuàng)建事件流的機制。宿:定義用于消費事件流的機制或計算。例如,AzureBLOBSinkDefinition定義了一種將事件流存儲到AzureBLOB中的機制。QueryDefinition:定義從源獲取所有事件并將它們放在宿中的計算。例如,從HTTPSource(ingressUri)取得所有事件,并將它們放在AzureBLOBSink(blobUri,storageAccountConnectionString)中。運行時實體概要盡管這高度依賴于消耗查詢的底層事件處理服務:查詢:根據(jù)QueryDefinition被創(chuàng)建,它表示運行時計算,該運行時計算從源(從SourceDefinition實例化)取得所有事件,并將它們放入宿(從SinkDefinition實例化)。流:作為服務中的設施,它是從由事件處理服務托管和控制的流實例化的事件流。該服務向流提供了用來消耗或產(chǎn)生事件的源和宿。事件和流事件是記錄:鍵值/關(guān)聯(lián)集合。值可以是任何原始類型(.net/JSON)、數(shù)組或關(guān)聯(lián)集合(映射/字典)。流提供對有序和時間事件的確定性:給定相同的有序輸入和相同的查詢,其將總是生成相同的有序輸出。事件流的特征在于其時間和有序性質(zhì)。用于流的源實現(xiàn)ISource。它可以用用于分組的選擇符表達式被配置。如果缺少這些元素中的一個,則底層源將為該特定元素使用其缺省行為。下面是示例ISource定義。//取得HTTP源定義作為事件流用于事件流的宿(實現(xiàn)ISink)保留事件流的時間和次序?qū)傩浴?/得到BLOB宿定義作為事件流1:varstorage=svc.GetAzureBlobSink<string,CpuAverage>("https://myaccount.blob.core.windows.net/mycontainer/myblob","DefaultEndpointsProtocol=https;AccountName=...;AccountKey=...");事件流可以被細分為組。組由分組鍵指定。實際上,在這種情況下,事件流是一組子流,鍵的每個唯一值一個。計算被獨立地應用于每個子流。重新分組構(gòu)造可以用于改變分組。為了跨組在所有事件上操作,用戶可以將所有組重新分組為一個組。服務上下文查詢被部署在服務內(nèi)部。該服務能夠處理查詢定義和對諸如啟動/停止查詢之類的查詢執(zhí)行管理操作。用于初始化服務上下文的簡單姿勢可以如下://從事件流得到源和宿1:ServiceContextsvc=newServiceContext(serviceUri);From(來自)/To(去往)從取得ISource作為參數(shù)并返回定義可用于事件流的運算符集合的IGroupedStream接口的TemporalInput.From(源)姿勢開始定義查詢。IGroupedStream表示分割的事件流。當利用ISink作為參數(shù)在IGroupeStream上調(diào)用To姿勢時,返回查詢定義。SteamR運算符Filter(where)基于應用于每個單獨事件的用戶定義的謂詞表達式,確定應該保留哪些事件或從分組的流移除哪些事件。TemporalInput.From(httpSource).Where(e=>e.Payload.CpuUsage>50).To(blobSink);Projection(選擇)將用戶表達式應用于每個單獨的事件并且產(chǎn)生可能是不同類型的新事件。以下編碼示例示出了如何使用過濾和投影(projection):多播運算符創(chuàng)建每個分組流的多個副本(組成員資格/鍵不被多播修改)。聯(lián)合運算符將多個分組流組合成單個分組流(組成員資格/鍵不被修改,具有相同鍵的事件將以同一組告終)。排序被聯(lián)合保留。Aggregate(聚合)聚合運算符將聚合函數(shù)應用到分組流的子集中??梢酝ㄟ^時間屬性(例如,窗口持續(xù)時間)、每個組中的單獨事件的數(shù)量(計數(shù)窗口)或定義子集的開始和結(jié)束的謂詞(基于范圍或條件的窗口)來定義這一窗口。聚合函數(shù):平均值、最小值、最大值、計數(shù)、總和和StdDev。聚合可被設置如下:還支持多聚合計算。API允許將多個聚合函數(shù)應用于有效載荷。以下示例圖示了將3個聚合函數(shù)應用于事件有效載荷。TopK(topK)TopK是聚合函數(shù),其對形成分組流的子集的事件進行排序,并且產(chǎn)生用于分組流內(nèi)的每個組的前K個值作為輸出。這一子集(或窗口)可以由時間屬性(諸如窗口持續(xù)時間)、每個組中的單獨事件的數(shù)量(計數(shù)窗口)或定義子集的開始和結(jié)束的謂詞(范圍或條件)來定義。它以與在以上代碼片段中應用函數(shù)的相同方式被應用。Windowdefinition(窗口定義)(*window)窗口基于計數(shù)(計數(shù)窗口)、基于條件或基于時間屬性(諸如窗口持續(xù)時間)來緩沖事件子集。然后,可以對這一子集應用任意集合的運算符。滾動窗口運算符的代碼樣本如下:事件處理編程模型定義了都從窗口運算符繼承的4個特定窗口;那些是CountWindow、ConditionalWindow、TumblingWindow和HoppingWindow。ReGroupby/Merge(regroupBy/合并)Regroupby運算符通過將新的鍵控函數(shù)應用于每個單獨的事件來重新定義事件組成員資格。作為輸出,regroupby運算符基于新鍵來產(chǎn)生新的一組的分組流。合并運算符僅僅是基于regroupby的宏,其中鍵是常量值(結(jié)果是使所有事件具有相同的組成員資格,即具有僅一個組的分組流的集合)。Join(結(jié)合)在其最簡單的形式中,其在計數(shù)窗口上使兩個分組流相關(guān)。Temporaljoin(時間結(jié)合)基于用戶定義的謂詞表達式和被應用于一對事件的用戶定義的投影表達式,在給定時間窗口(持續(xù)時間)內(nèi)使兩個分組流相關(guān)。TimeTravelJoin(時間旅行結(jié)合)類似于時間結(jié)合,因為它使兩個分組流相關(guān),具有回顧分組流集合之一的歷史的附加能力(也被稱為時間旅行)。以下是具有歷史和實況流的查詢的示例。時間旅行結(jié)合是值得更多細節(jié)的特殊運算符。為了使能對實時和歷史數(shù)據(jù)的高級分析,事件處理編程模型可以引入具有時間旅行的時間結(jié)合。上面的樣本表示一個典型情形。這一運算符允許對歷史數(shù)據(jù)回到過去(根據(jù)rightTimeTravelShift參數(shù)重放事件并修改其時間戳),并且然后通過CEDR時間結(jié)合將其與實況流相關(guān)。rightDuration參數(shù)指定如何改變歷史事件的持續(xù)時間以能夠?qū)⑺鼈兣c來自實況流的點事件結(jié)合。時間旅行結(jié)合的一個非常有趣的方面是它由實況流的時間線驅(qū)動。在最簡單的實現(xiàn)方式中,將從時間的開始讀取完整的歷史流,并將其與實況流結(jié)合。然而,在許多情況下,這是不期望的,因為歷史流可以具有大量不必要的數(shù)據(jù),并且在實況流和歷史流將在時間上對齊之前可能花費相當長的時間。例如,如果歷史流包含來自最近10年的數(shù)據(jù),則在到達可以實際結(jié)合的部分之前將需要預處理9年的數(shù)據(jù)。圖6圖示了與兩個事件流(一個當代和一個歷史)的結(jié)合相關(guān)聯(lián)的事件流。代替從開始重放所有事件,向歷史流的源傳達我們感興趣的僅有的數(shù)據(jù)回到一年前將是更加高效的。我們感興趣的時間位置不能在查詢的編譯階段確定。僅當結(jié)合接收到來自實況流的第一個事件時才發(fā)現(xiàn)開始時間位置。映射到目前為止我們一直討論的用戶表面層負責定義簡單的標準數(shù)據(jù)變換(諸如“哪里”,“選擇”等),從而向用戶隱藏復雜性。此層由客戶端側(cè)SDK或DSL表示。它包含特定編程語言的服務實體的客戶端側(cè)代理,并提供用于組合的手段。在該層上,用戶能夠獲取內(nèi)置的定義并將它們組合到查詢中。該層的另一職責是將依賴于語言的SDK實體轉(zhuǎn)換為它們的內(nèi)部表示——其是語言無關(guān)的并且可以被實體組成層理解。該過程被稱為規(guī)范化。在此過程期間是以某一規(guī)范形式映射查詢,其稍后可以在邊緣云中運行的引擎中被映射。雖然可能存在不同類型的真實事件處理引擎;對于用戶都是一樣的。本文檔描述了事件編程模型編程模型的概念。事件處理編程模型可以統(tǒng)一流處理的不同維度,允許離線和在線分析的方便集成,以及以可擴展和直觀的方式在云中和在設備上收集數(shù)據(jù)。由于各種定義的創(chuàng)作可使用計算系統(tǒng)而被執(zhí)行,并且對應的查詢使用計算系統(tǒng)而被運行,現(xiàn)在將描述示例計算系統(tǒng)。計算系統(tǒng)現(xiàn)在越來越多地采取各種各樣的形式。計算系統(tǒng)可以例如是手持式設備、電器、膝上型計算機、臺式計算機、大型機、分布式計算系統(tǒng),或甚至通常尚未被認為是計算系統(tǒng)的設備。在本說明書和權(quán)利要求書中,術(shù)語“計算系統(tǒng)”被寬泛地定義為包括如下的任何設備或系統(tǒng)(或其組合),它們包括至少一個物理和有形的處理器以及物理和有形的存儲器,該物理和有形的存儲器能夠在其上具有可由處理器執(zhí)行的可執(zhí)行指令。存儲器可以采取任何形式,并且可以取決于計算系統(tǒng)的性質(zhì)和形式。計算系統(tǒng)可以被分布在網(wǎng)絡環(huán)境上并且可以包括多個組成計算系統(tǒng)。如圖7中所示,在其最基本的配置中,計算系統(tǒng)700通常包括至少一個硬件處理單元702和存儲器704。存儲器704可以是物理系統(tǒng)存儲器,其可以是易失性、非易失性或這兩者的某種組合。術(shù)語“存儲器”在這里也可以用于指非易失性大容量存儲器,諸如物理存儲介質(zhì)。如果計算系統(tǒng)是分布式的,則處理、存儲器和/或存儲能力也可以是分布式的。如在這里所使用的,術(shù)語“可執(zhí)行模塊”或“可執(zhí)行組件”可以指可以在計算系統(tǒng)上被執(zhí)行的軟件對象、路由或方法。在這里所描述的不同組件、模塊、引擎和服務可以被實現(xiàn)為在計算系統(tǒng)上執(zhí)行的對象或進程(例如,作為單獨的線程)。在下面的描述中,參考由一個或多個計算系統(tǒng)執(zhí)行的動作來描述實施例。如果這樣的動作以軟件實現(xiàn),則執(zhí)行動作的相關(guān)聯(lián)的計算系統(tǒng)的一個或多個處理器響應于已經(jīng)執(zhí)行了計算機可執(zhí)行指令來指引計算系統(tǒng)的操作。例如,這樣的計算機可執(zhí)行指令可以被體現(xiàn)在形成計算機程序產(chǎn)品的一個或多個計算機可讀介質(zhì)上。這樣的操作的示例涉及對數(shù)據(jù)的操縱。計算機可執(zhí)行指令(和被操縱的數(shù)據(jù))可以被存儲在計算系統(tǒng)700的存儲器704中。計算系統(tǒng)700還可以包含通信信道708,其允許計算系統(tǒng)700通過例如網(wǎng)絡710與其他消息處理器通信。計算系統(tǒng)700還包括顯示器,其可以用于向用戶顯示視覺表示。在這里所描述的實施例可包括或利用包括計算機硬件的專用或通用計算機,計算機硬件諸如例如是一個或多個處理器和系統(tǒng)存儲器,如在下面更詳細討論的。在這里所描述的實施例還包括用于攜帶或存儲計算機可執(zhí)行指令和/或數(shù)據(jù)結(jié)構(gòu)的物理和其他計算機可讀介質(zhì)。這樣的計算機可讀介質(zhì)可以是可以由通用或?qū)S糜嬎銠C系統(tǒng)訪問的任何可用介質(zhì)。存儲計算機可執(zhí)行指令的計算機可讀介質(zhì)是物理存儲介質(zhì)。攜帶計算機可執(zhí)行指令的計算機可讀介質(zhì)是傳輸介質(zhì)。因此,作為示例而非限制,本發(fā)明的實施例可以包括至少兩種截然不同種類的計算機可讀介質(zhì):計算機存儲介質(zhì)和傳輸介質(zhì)。計算機存儲介質(zhì)包括RAM、ROM、EEPROM、CD-ROM或其它光盤存儲裝置、磁盤存儲裝置或其它磁存儲設備,或任何其他物理和有形的存儲介質(zhì),其可用于存儲計算機可執(zhí)行指令或數(shù)據(jù)結(jié)構(gòu)的形式的所需的程序代碼裝置,并且可以由通用或?qū)S糜嬎銠C訪問?!熬W(wǎng)絡”被定義為使得能夠在計算機系統(tǒng)和/或模塊和/或其他電子設備之間傳送電子數(shù)據(jù)的一個或多個數(shù)據(jù)鏈路。當通過網(wǎng)絡或另一通信連接(硬連線、無線或硬連線或無線的組合)向計算機傳送或提供信息時,計算機適當?shù)貙⒃撨B接視為傳輸介質(zhì)。傳輸介質(zhì)可以包括網(wǎng)絡和/或數(shù)據(jù)鏈路,其可以用于攜帶計算機可執(zhí)行指令或數(shù)據(jù)結(jié)構(gòu)的形式的期望的程序代碼裝置,并且可以由通用或?qū)S糜嬎銠C訪問。上述的組合也應被包括在計算機可讀介質(zhì)的范圍內(nèi)。另外,在到達各種計算機系統(tǒng)組件之后,計算機可執(zhí)行指令或數(shù)據(jù)結(jié)構(gòu)的形式的程序代碼裝置可以被從傳輸介質(zhì)自動地傳送給計算機存儲介質(zhì)(反之亦然)。例如,通過網(wǎng)絡或數(shù)據(jù)鏈路接收到的計算機可執(zhí)行指令或數(shù)據(jù)結(jié)構(gòu)可以被緩存在網(wǎng)絡接口模塊(例如,“NIC”)內(nèi)的RAM中,并且然后最終被傳送給計算機系統(tǒng)RAM和/或計算機系統(tǒng)處的較不易失性的計算機存儲介質(zhì)。因此,應當理解,計算機存儲介質(zhì)可以被包括在也(或甚至主要地)利用傳輸介質(zhì)的計算機系統(tǒng)組件中。計算機可執(zhí)行指令包括例如當在處理器處被執(zhí)行時使得通用計算機、專用計算機或?qū)S锰幚碓O備執(zhí)行某一功能或一組功能的指令和數(shù)據(jù)。計算機可執(zhí)行指令可以例如是在由處理器直接執(zhí)行之前經(jīng)歷一些轉(zhuǎn)換(諸如編譯)的二進制文件或甚至指令,諸如中間格式指令(諸如匯編語言),或甚至源代碼。盡管已經(jīng)用對結(jié)構(gòu)特征和/或方法動作專用的語言描述了主題,但是將會理解,所附權(quán)利要求中定義的主題內(nèi)容不一定限于所描述的特征或上面描述的動作。而是,所描述的特征和動作作為實現(xiàn)權(quán)利要求的示例形式而被公開。本領域技術(shù)人員將認識到,本發(fā)明可以在具有許多類型的計算機系統(tǒng)配置(包括個人計算機、臺式計算機、膝上型計算機、消息處理器、手持設備、多處理器系統(tǒng)、基于微處理器的或可編程的消費者電子產(chǎn)品、網(wǎng)絡PC、小型計算機、大型計算機、移動電話、PDA、尋呼機、路由器、交換機等)的網(wǎng)絡計算環(huán)境中被實踐。本發(fā)明還可以在分布式系統(tǒng)環(huán)境中被實踐,在分布式系統(tǒng)環(huán)境中通過網(wǎng)絡(要么通過硬連線的數(shù)據(jù)鏈路、無線數(shù)據(jù)鏈路,要么通過硬連線的和無線數(shù)據(jù)鏈路的組合)被鏈接的本地和遠程的計算機系統(tǒng)都執(zhí)行任務。在分布式系統(tǒng)環(huán)境中,程序模塊可以位于本地和遠程存儲器存儲設備二者中。在不脫離本發(fā)明的精神或本質(zhì)特性的情況下,本發(fā)明可以按照其他具體形式被體現(xiàn)。所描述的實施例在所有方面都將被認為僅是說明性的而不是限制性的。因此,本發(fā)明的范圍由所附權(quán)利要求書而不是由前面的描述來指示。在權(quán)利要求的等同物的含義和范圍內(nèi)的所有變化將被包括在其范圍內(nèi)。當前第1頁1 2 3 當前第1頁1 2 3 
當前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1