More Related Content
PDF
ng-japan 2015 TypeScript+AngularJS 1.3 PDF
PDF
PDF
PPTX
[社内勉強会]ELBとALBと数万スパイク負荷テスト PDF
PPTX
PDF
What's hot
PDF
コンテナ時代だからこそ要注目! Cloud Foundry PDF
Linuxのユーザーランドをinitから全てまるごとgolangで書く PDF
PDF
The History of Reactive Extensions PPTX
開発環境をVagrantからdockerに移行してみた PDF
Play framework 2.0のおすすめと1.2からのアップグレード PDF
東京Node学園 今できる通信高速化にトライしてみた PPTX
node-gypを使ったネイティブモジュールの作成 PDF
コンテナ事例 CircleCI, Cucumber-Chef PPTX
PPTX
OpenShift from Easy way to Hard ? Way PDF
linq.js - Linq to Objects for JavaScript PDF
PDF
大規模Node.jsを支える ロードバランスとオートスケールの独自実装 PDF
パフォーマンス計測Ciサービスを作って得た知見を共有したい PDF
.NET最先端技術によるハイパフォーマンスウェブアプリケーション PDF
PDF
Vagrant & Dockerによるイマドキの開発環境構築 PPTX
PDF
はてなにおける継続的デプロイメントの現状と Docker の導入 Similar to Web socket and gRPC
PDF
PDF
PPTX
REST API、gRPC、GraphQL 触ってみた【2023年12月開催勉強会資料】 PDF
PDF
WebSocket + Node.jsでつくるチャットアプリ PDF
grpc-gateway を試してみた fukuoka.go#11 PPTX
NSQ-Centric Architecture (GoCon Autumn 2014) PPTX
WebRTC SFU Mediasoup Sample update PPTX
PDF
PDF
Janogia20120921 yoshinotakeshi PDF
最新Web 通信系API総まくり!WebRTC, Streams, Push api etc. PPTX
PDF
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for... PPTX
PPTX
SL囲む会東京5 Nodejs×Silverlightではまったこと PDF
Signs;Gate - RESTfulなサイトの作り方 (Gunma.web #6 2011/09/03) PDF
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション PDF
PlayFramework1.2.4におけるWebSocket PDF
メルカリ・ソウゾウでは どうGoを活用しているのか? Web socket and gRPC
- 1.
- 2.
- 3.
- 4.
パクって作ってみた - Gopher-war
•https://github.com/olahol/melody/blob/master/examples/gopher
s/demo.gif
• しかし、弾が出ない、勝ち負けがわからないなどの不満も・・・
弾は出ないです
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
ためうちの実装
• チャージ setTimeout を2回使います。
if (missileload === true) {
if (mycharge === "none") {
chargingTimerid = setTimeout(()=>{
mycharge = "charging";
show(myid, e.pageX, e.pageY, mylife, myname, mycharge);
ws.send(["show", e.pageX, e.pageY, mycharge].join(" "));
chargedTimerid = setTimeout(()=>{
mycharge = "charged"
show(myid, e.pageX, e.pageY, mylife, myname, mycharge);
ws.send(["show", e.pageX, e.pageY, mycharge].join(" "));
}, 300);
}, 700);
- 11.
gRPC
• Googleが開発したRPC(Remote ProcedureCall)を行うためのプロトコル
• protoファイルと呼ばれるIDL(Interface Definition Language)でAPIを定義
• 単方向と双方向の通信が可能。複数のリクエスト・レスポンスを捌ける
syntax = "proto3";
package message;
option go_package ="message";
import "github.com/mwitkow/go-proto-validators/validator.proto";
service MessageService {
rpc Connect (ConnectRequest) returns (Empty);
rpc Disconnect (DisconnectRequest) returns (Empty);
rpc ReceiveMessage (ReceiveMessageRequest) returns (stream ReceiveMessageResponse);
rpc SendMessageOthers (SendMessageRequest) returns (Empty);
rpc SendMessageAll (SendMessageRequest) returns (Empty);
}
message Empty {
}
message ConnectRequest {
string id = 1 [(validator.field) = {msg_exists : true}];
string name = 2 [(validator.field) = {msg_exists : true}];
int64 x = 3;
int64 y = 4;
}
message DisconnectRequest {
string id = 1 [(validator.field) = {msg_exists : true}];
}
message ReceiveMessageRequest {
string from_id = 1 [(validator.field) = {msg_exists : true}];
}
message ReceiveMessageResponse {
string from_id = 1 [(validator.field) = {msg_exists : true}];
string type = 2 [(validator.field) = {msg_exists : true}];
repeated string params = 3;
}
message SendMessageRequest {
string from_id = 1 [(validator.field) = {msg_exists : true}];
string type = 2 [(validator.field) = {msg_exists : true}];
repeated string params = 3;
}
- 12.
- 13.
React + Redux
•React … Facebook製のJSライブラリ。
• ざっくりいうと、MVCのVを担当するフレームワーク。Githubスター数11万強
• Redux … アプリケーションの状態管理を行うためのFluxアーキテクチャを実装し
たライブラリ。
• React向けに開発されているが他のライブラリにも適用可能。
- 14.
Redux-Saga
• React+Reduxで非同期処理を手続的に記述できるミドルウェア
• takeで待受、callで、非同期呼び出し、putでディスパッチ
function*handleConnect() {
while (true) {
const action = yield take(CONNECT_START_EVENT)
console.log("handleConnect: action=" + JSON.stringify(action))
const { error } = yield call(
MessageApi.connectAsync,
action.payload.id,
action.payload.name,
)
if (error) {
console.log(error)
yield put(connectFailureEvent())
} else {
yield put(connectSuccessEvent(action.payload.id, action.payload.name, "/main"))
}
}
}
- 15.
- 16.
- 17.
Redux-Saga双方向の実装
• eventChanelを作成し、emitでactionを返し、putします。
function* watchRefresh(){
const action = yield take(REFRESH_START_EVENT)
const channel = yield call(createRefreshChannel, action.payload.id)
while (true) {
const payload = yield take(channel)
yield put(payload)
}
}
function createRefreshChannel(id) {
return eventChannel(emit => {
const iv = setInterval(() => {
emit(sendMessageAllStartEvent(id,"refresh",[]))
}, 1)
return () => {
clearInterval(iv)
}
})
}
- 18.
gPRCでのPush通知
• ChannelをQueueとして
• 使って実現しました。
//ReceiveMessage method
func (s *MessageServer) ReceiveMessage(req
*message.ReceiveMessageRequest, stream
message.MessageService_ReceiveMessageServer) (err error) {
fmt.Println("ReceiveMessage is called")
connection, ok := s.connections[req.FromId]
if !ok {
msg := fmt.Sprintf("FromId:%s does not exist", req.FromId)
return errors.New(msg)
}
loop:
for {
select {
case msg := <-connection.queue:
params := strings.Split(msg, " ")
stream.Send(&message.ReceiveMessageResponse{
FromId: connection.id,
Type: params[0],
Params: params[1:],
})
case <-connection.disconnect:
break loop
}
}
return nil
}
//Show new player to other players
for _, connection := range s.connections {
msg := fmt.Sprintf("show %s %s %d %d %d %d %s",
player.id,
player.name,
player.life,
player.x,
player.y,
player.size,
player.charge)
connection.queue <- msg
}
- 19.
圧倒的スケール!
• Web socketファイル数 2 600行
• gRPC + React ファイル数 40 1450行
0
10
20
30
40
ファイル数
0
375
750
1125
1500
1875
Line
- 20.