Golang Day 3

學習其實很無聊~沒有特別要做什麼的話,看著看著就想睡了~ 所以後來決定,之後就把程式碼做好放到 github 去好了
一次想一個想要做的小功能,這樣或許比較有趣


Golang Day 2

Golang 語法注意

  • 格式很重要,不管是空行或者是 TAB、大括號等位置,很重要,會編譯不過。不過可以用 gofmt 工具幫你自動排版程式。
  • 所有的程式需要用 package 整理,有點像是 java package/module 的觀念
  • 主程式一定是 package main, 而且一定會呼叫 func main()
  • 引用不必要的 packages 會錯誤
  • 沒用到的變數也會錯誤
  • 不需要分號結尾
  • 條件式不需要用 () 包起來 (這我就有點不習慣了~因為 Java, javascript, C# 都要)
  • golang 應該不算是 OOP, 所以要習慣沒有類別 (Class) 封裝這件事情

Reference


Golang Day 1

安裝

1
brew install golang

環境設定

  • GOROOT: GO 安裝的地方,用 brew 安裝的,可以設定 /usr/local/opt/go/libexec 就可以
  • GOPATH: GO 執行的時候要的路徑,看專案在哪邊就設定在哪邊

GOPATH

一般是指向專案位置,裡面還會切分三個目錄

  • src: 一般程式碼放的地方,可以包含網址.比如說 github.com/golang/golint 這樣的方式
  • pkg: 編譯後的檔案
  • bin: binary file

Empty Go

1
package main
2
3
func main() {
4
5
}

注意空行以及大括弧的位置,golang 很注意程式碼格式

HelloWorld

1
package main
2
3
import "fmt"
4
5
func main() {
6
    fmt.Println("Hello, World")
7
}

Akka.Net 不錯用

真的使用之後,越來越覺得 Actor Model 是個好物,因為他本來就是拿來做平行運算用的。

建議可以先從以下的幾篇文章以及 Github 的範例開始

好處

我剛開始做的時候,其實是想到 Sequence Diagram。因為 Actor Model 的重點其實就是在訊息的傳遞與處理,只是在整體架構上有一個 ActorSystem 幫忙做處理

根據以下的圖片

一個 Actor 在建立之後,AkkaDotNet 會幫你建立整個 Actor 的基本行為。 包含一個 Mailbox、預設的狀態等,而且也預設了每個 Actor 都有可以有 Children Actors 所以,當你傳遞一個訊息給 Actor 的時候,其實不是直接呼叫 Actor 中處理訊息的方法,而是先進入 Mailbox,類似郵件的方式排隊處理。

當處理有問題的時候,你是可以在 Handle 方法中,直接拋出錯誤,讓 Actor 失敗。如此一來就會觸發上層 Actor 的 SupervisorStrategy。預設的 Strategy 可以參考 Fault Tolerance 文件

以下是本機範例

1
// Create a new actor system (a container for your actors)
2
var system = ActorSystem.Create("MySystem");
3
4
// Create your actor and get a reference to it.
5
// This will be an "ActorRef", which is not a
6
// reference to the actual actor instance
7
// but rather a client or proxy to it.
8
var greeter = system.ActorOf<GreetingActor>("greeter");
9
10
// Send a message to the actor
11
greeter.Tell(new Greet("World"));
12
13
// This prevents the app from exiting
14
// before the async work is done
15
Console.ReadLine();

Akka.Remote

你寫好了 Actor,也在同一個系統中跑完所有的流程,如果你需要做分散 Loading 的動作,不需要你把程式碼呼叫的部分再大改。

你只需要改變取得 Actor 的路徑。

是的,路徑!

預設取得 Actor 的路徑是用 actor name 來取得,取回來之後基本上就是一個 IActorRef 類別的物件(可以參考上面的範例)

當你需要取得遠端的 ActorRef 時,你只需要修改設定(當然要加上 Akka.Remote 套件)

1
akka {
2
    actor {
3
        provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote"
4
    }
5
6
    remote {
7
        helios.tcp {
8
            port = 8080
9
            hostname = localhost
10
        }
11
    }
12
}

然後修改你取得 Actor 的『路徑』就可以。就好像訪問 HTTP 一樣的路徑~

像上面的本機範例,取得 Actor 的路徑改一下就可以

1
var greeter = system.ActorOf<GreetingActor>("akka.tcp://MySystem@localhost:8080/user/greeter");

Akka.Cluster

當你的系統越來越大,需要擴充的時候,可以參考使用 Akka.Cluster 一樣不太需要調整太多程式,只需要加上 Akka.Cluster 套件使用以及設定調整 主體處理邏輯應該都不需要調整太多(除非你寫的太爛~)

Akka.Cluster 與 Akka.Remote 不太一樣的是,多出了 High Availability 的管理。 主要是針對每個 Actor System Node 間的互相認知通訊,以及其他管理節點的功能 但是因為我還沒用到,詳細的東西我不太清楚

參考