1. 程式人生 > >下一代的 Actor 模型框架 Proto Actor

下一代的 Actor 模型框架 Proto Actor

ProtoAct 是下一代的 Actor 模型框架,提供了 .NET 和 Go 語言的實現,預設支援分散式,提供管理和監控功能。在過去幾年,我們經常看到兩種 Actor 模型方法相互競爭,首先是經典的 Erlang/Akka 風格的 Actor 模型;以及微軟的“虛擬Actor”或者成為“Grains” 的風格。這兩種風格有各自的優缺點。

而 Proto.Actor 將這兩種風格結合在一起形成一個通用的框架。同時解決了另外一個主要的問題 —— 目前已有的 Actor 框架或者是語言無法在不同平臺間進行通訊,選擇了一種框架會導致你鎖定到某一個特定平臺上。

這也就是為什麼 Proto.Actor 引入了“Actor 標準協議”的概念,這是一個可以被不同語言實現的基礎原語的協議。這改變了 Actor 系統中的遊戲規則,你可以自由的為你基於 Actor 的微服務選擇不同的語言,這在之前是不可想象的。

Proto.Actor 提供了可伸縮、實時的事務處理,適用的場景包括:

  • 投資和商業銀行業務

  • 零售

  • 社交媒體

  • 模擬

  • 遊戲和賭博

  • 汽車和交通系統

  • 衛生保健

  • 資料分析

任何需要高吞吐量、低延遲的業務需求都可以用到 Proto.Actor 。

Actors :

640?wx_fmt=png

關於 Actor 模型的介紹:

Actor模型在併發程式設計中是比較常見的一種模型。很多開發語言都提供了原生的Actor模型。例如erlang,scala等。

640?wx_fmt=jpeg

Actor,可以看作是一個個獨立的實體,他們之間是毫無關聯的。但是,他們可以通過訊息來通訊。一個Actor收到其他Actor的資訊後,它可以根據需要作出各種相應。訊息的型別可以是任意的,訊息的內容也可以是任意的。這點有點像webservice了。只提供介面服務,你不必瞭解我是如何實現的。

一個Actor如何處理多個Actor的請求呢?它先建立一個訊息佇列,每次收到訊息後,就放入佇列,而它每次也從佇列中取出訊息體來處理。通常我們都使得這個過程是迴圈的。讓Actor可以時刻處理髮送來的訊息。

Go 示例程式碼 https://github.com/AsynkronIT/protoactor-go  :

type Hello struct{ Who string }
type HelloActor struct{}

func (state *HelloActor) Receive(context actor.Context) {
    switch msg := context.Message().(type) {
    case
 Hello:         fmt.Printf("Hello %v\n", msg.Who)     } } func main() {     props := actor.FromInstance(&HelloActor{})     pid := actor.Spawn(props)     pid.Tell(Hello{Who: "Roger"})     console.ReadLine() }

C# 示例程式碼 https://github.com/AsynkronIT/protoactor-dotnet  :

using System;using Proto;class Program{
    static void Main(string[] args)
    {
        var props = Actor.FromFunc(ctx =>
        {
            if(ctx.Message is string)
                ctx.Respond("hey");
            return Actor.Done;
        });
        var pid = Actor.Spawn(props);

        var reply = pid.RequestAsync<object>("hello").Result;
        Console.WriteLine(reply);
    }
}

相關文章:

原文地址:https://www.oschina.net/p/protoactor

.NET社群新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

640?wx_fmt=jpeg