Skip to content

Scalable game server framework with clustering support and client libraries for iOS, Android, Unity and others through the C SDK.

License

Notifications You must be signed in to change notification settings

maxzorzetti/pitaya

Repository files navigation

pitaya Build Status GoDoc Go Report Card MIT licensed

pitaya is an easy to use, fast, lightweight game server networking library for Go. It provides a core network architecture and a series of tools and libraries that can help developers eliminate boring duplicate work for common underlying logic. The goal of pitaya is to improve development efficiency by eliminating the need to spend time on repetitious network related programming.

pitaya was designed for server-side applications like real-time games, social games, mobile games, etc of all sizes.

How to build a system with pitaya

What does a pitaya application look like?

The simplest "pitaya" application as shown in the following figure, you can make powerful applications by combining different components.

Application

In fact, the pitaya application is a collection of  Component , and a component is a bundle of  Handler, once you register a component to pitaya, pitaya will register all methods that can be converted to Handler to pitaya service container. Service was accessed by Component.Handler, and the handler will be called while client request. The handler will receive two parameters while handling a message:

  • *session.Session: corresponding a client that apply this request or notify.
  • *protocol.FooBar: the payload of the request.

While you had processed your logic, you can response or push message to the client by session.Response(payload) and session.Push('eventName', payload), or returns error when some unexpected data received.

How to build distributed system with pitaya

pitaya has no built-in distributed system components, but you can easily implement it with gRPC and smux . Here we take grpc as an example.

  • First of all, you need to define a remote component
type RemoteComponent struct {
	rpcClients []*grpc.ClientConn
}
  • Second, fetch all grpc servers infomation from services like etcd or consul in pitaya lifetime hooks
type ServerInfo struct {
	Host string `json:"host"`
	Port int    `json:"port"`
}

// lifetime callback
func (r *RemoteComponent) Init() {
	// fetch server list from etcd
	resp, err := http.Get("http://your_etcd_server/backend/server_list/area/10023")
	if err != nil {
		panic(err)
	}

	servers := []ServerInfo{}
	if err := json.NewDecoder(resp.Body).Decode(&servers); err != nil {
		panic(err)
	}

	for i := range servers {
		server := servers[i]
		client, err := grpc.Dial(fmt.Sprintf("%s:%d", server.Host, server.Post), options)
		if err != nil {
			panic(err)
		}
		r.rpcClients = append(r.rpcClients, client)
	}
}

func (r *RemoteComponent) client(s *session.Session) *grpc.ClientConn {
	// load balance
	return r.rpcClients[s.UID() % len(s.rpcClients)]
}

// Your handler, accessed by:
// nanoClient.Request("RemoteComponent.DemoHandler", &pb.DemoMsg{/*...*/})
func (r *RemoteComponent) DemoHandler(s *session.Session, msg *pb.DemoMsg) error {
	client := r.client(s)
	// do something with client
	// ....
	// ...
	return nil
}

The pitaya will remain simple, but you can perform any operations in the component and get the desired goals. You can startup a group of pitaya application as agent to dispatch message to backend servers.

Documents

Resources

Community

Successful cases

Installation

go get github.com/topfreegames/pitaya

# dependencies
go get -u github.com/golang/protobuf
go get -u github.com/gorilla/websocket

Benchmark

# Case:   PingPong
# OS:     Windows 10
# Device: i5-6500 3.2GHz 4 Core/1000-Concurrent   => IOPS 11W(Average)
# Other:  ...

cd $GOPATH/src/github.com/topfreegames/pitaya/benchmark/io
go test -v -tags "benchmark"

License

MIT License

About

Scalable game server framework with clustering support and client libraries for iOS, Android, Unity and others through the C SDK.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Go 98.9%
  • Other 1.1%