iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
0
自我挑戰組

用Unity製作連線遊戲系列 第 16

Toss Message via Channel

  • 分享至 

  • xImage
  •  

match-game-front利用Graphql接到開始配對後,會用grpc通知simulate-match,這是目前規劃的。實際上在執行時卻碰到一些問題。本來的想法是將grpc connection以global的方式讓另一個檔案可以引用。會這樣規劃的原因也是由於gqlgen會產生schema.resolver.go檔。而這個檔裡的function參數都是固定的,也不清是不是可以利用context的概念,額外將grpc connection放進去。印象中,javascript的apllo server好像是有這樣的寫法。但不清楚的情況下,就只能用其它方式處理。

為了能夠在不同的檔案之間使用global變數,參考了

但隨及碰到的問題是不清楚是否grpc的型別特殊,只能在main裡建立connection時將此值assign到grpcConnection變數,但在另一個function裡取用並call其function時會一直有問題。試了幾個寫法,都沒有用,最後就只能放棄,找其它方法。

心理想著,或許channel就是針對這樣的問題最好的解決方法。利用in-app message傳送的概念,理應可以完成這個任務。在這樣的想法下,將變數的型別改成channel,並且在另一個function裡使用,結果相當不錯。而grpc connection,一樣在main裡建構後,直接在裡面的goroutine使用

func main() {
	go func() {
		for {
			select {
			case x, ok := <- sub.RequestChannel:
				fmt.Println("has msg")
			default:
				//time.Sleep(1000 * time.Millisecond)
				runtime.Gosched()
				fmt.Println("no msg")
			}
		}
  }()
}

原先是用time的方式進行轉換,後來參考了這篇文章後,就改成runtime.Gosched(),但還不清楚這二個方式哪個較好,或是都不合適。

Different GraphQL Usage

另一個不確定的地方在於graphql-codegen和gqlgen是否在解析graphql檔案時是一致的?試著直接將graphql-codegen可以轉換的graphql檔案丟入gqlgen,會產生無法parse的錯誤。但不知道這樣的錯誤是不是gqlgen.yml檔沒有設定好所導致的。另外,對於gqlgen預設是讀取graphqls而不是graphql副檔名這件事感到無法理解,雖然graphql的副檔名應該沒有統一命名的方式,但是by convention,多數會用graphql才對。這點不是很清楚到底gqlgen的預設思考點為何。擔心的事其開發者是想要標新立異,那在這樣的思考點下,會不會它parse的方式和其它library截然不同?

這篇討論裡有提到多個schema的寫法,基本上是要用extend type的方式進行。但碰到的問題其實是這個檔案

query findUser($userId: ID!) {
  user(id: $userId) {
    ...UserFields
  }
}

fragment UserFields on MyUser {
  id
  username
  role
}

這是之前用的範例,graphql-codegen可以將operation的概念放在另一處,但這個檔案放到gqlgen會有問題。查詢後看到的討論

gqlgen的設計上就是不會parse這樣的query。從這裡得到的結論是,有些要讓graphql-codegen解析的檔案,不應該丟給gqlgen。簡單來說就是要做好分流,schema的分流。

2 out of 3 Looking Good

花了一些時間弄了docker compose設定檔

version: "3.5"

services:
    match-game-front:
        container_name: match-game-front
        build: ./match-game-front
        ports:
            - "8200:8200"
        command: /server
        depends_on:
            - simulate-match
        networks:
            - backend
    simulate-match:
        container_name: simulate-match
        build: ./simulate-match
        ports:
            - "8201:8201"
        command: /server
        networks:
            - backend
networks:
    backend:
        driver: bridge

一開始還是container之間還是連不到,直到在simulate-match的listen那從localhost調整成

conn, err := grpc.Dial("simulate-match:8201", grpc.WithInsecure())

就可以連到了

Starting simulate-match ... done
Recreating match-game-front ... done
Attaching to simulate-match, match-game-front
match-game-front    | 2020/09/16 14:09:00 connect to http://localhost:8200/ for GraphQL playground
match-game-front    | Value %!d(string=aassaa) was read.
simulate-match      | 2020/09/16 14:09:05 receive client request, client send:abcdefg

雖然simulate那仍不是正確的,但今天就先進行到這。


上一篇
Simulte Match Service in Go
下一篇
Repo Structure
系列文
用Unity製作連線遊戲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言