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()
,但還不清楚這二個方式哪個較好,或是都不合適。
另一個不確定的地方在於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的分流。
花了一些時間弄了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那仍不是正確的,但今天就先進行到這。