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