天天看點

「推薦系統從0到1」通信協定

「推薦系統從0到1」通信協定

前沿

上回講到服務發現,也完成了服務發現的基礎建構。下面就要确定各個微服務之間的通訊協定了。

總的來說,初步分為幾個微服務,分為api,recall,filter,rank,先把這幾個微服務之間的通信協定定下來,再将裡面每一個子產品做完整。

先上github倉庫:github倉庫

第一版本簡單架構

api_server對外提供http服務,推薦系統内部則采用grpc通信。這圖确實有點醜,後面找點能看的。。。

「推薦系統從0到1」通信協定

通信協定

api_server調用recall_server protobuff

syntax = "proto3";

import "errmsg.proto";

package api;
option go_package = "go_server/src/lib/proto/api";

// 包括人口學特征,一些上下文特征等,後面會一直透傳這些特征。
message RecReq {
    string trace_id    = 1;
    string user_id     = 2;
    string gender      = 3;
    int32 age          = 4;
    string app_version = 5;
    string network     = 6;
    int32 page_num     = 7;
    int32 page_size    = 8;
}

message RecRespItems {
    string item_id = 1;
    string params  = 2;
}

message RecResp {
    errmsg.ErrMsg err           = 1;
    repeated RecRespItems items = 2;
}

service Rec {
    rpc Rec (RecReq) returns (RecResp) {}
}
           

recall_server調用filter_server

syntax = "proto3";

import "errmsg.proto";
import "recall.proto";

package filter;
option go_package = "go_server/src/lib/proto/filter";

message HistoryFilterReq {
    string user_id           = 1;
    recall.RecallResp recallResp = 2;
}

message HistoryFilterResp {
    errmsg.ErrMsg  err       = 1;
    recall.RecallResp recallResp = 2;
}

message HistoryAddReq {
    string user_id           = 1;
    int32 history_action     = 2;
    repeated string item_ids = 3;
}

message HistoryAddResp {
    errmsg.ErrMsg err = 1;
}

service Filter {
    rpc HistoryFilter (HistoryFilterReq) returns (HistoryFilterResp) {}
    rpc HistoryAdd (HistoryAddReq) returns (HistoryAddResp) {}
}
           

api_server調用rank_server

syntax = "proto3";

import "api.proto";
import "recall.proto";
import "errmsg.proto";

package rank;
option go_package = "go_server/src/lib/proto/rank";

message RankReq {
    api.RecReq req               = 1;
    recall.RecallResp recallResp = 2;
    string bucket                = 3;
}

message RankResp {
    errmsg.ErrMsg err                     = 1;
    repeated recall.RecallRespItems items = 2;
}

service Rank {
    rpc Rank (RankReq) returns (RankResp) {}
}
           

需要注意的點

其中go_package參數,需要加上go_server字首,不然編譯後,會有一點小問題,在go mod包管理下,pb檔案裡import的路徑會不對,同時需要在Makefile裡加一些小改動,具體看github倉庫吧。

跑一下

起4個視窗,啟動etcd,将4個微服務啟動,進入etcd docker容器,可以看到服務已經注冊成功。

➜  ~ docker exec -it etcd /bin/sh
# etcdctl get --prefix ""
/etcd/test/filter_server/192.168.31.71:59270
192.168.31.71:59270
/etcd/test/rank_server/192.168.31.71:59275
192.168.31.71:59275
/etcd/test/recall_server/192.168.31.71:59280
192.168.31.71:59280
           

簡單調用一下,傳回結果符合預期,沒問題。

➜  ~ curl -d '{"user_id":"jinfeng"}' "http://127.0.0.1:20019/rec"
{"items":[{"item_id":"item_id1"},{"item_id":"item_id2"}]}
           

後面就可以加一些簡單的召回了,下周搞起,奧利給!

「推薦系統從0到1」通信協定

繼續閱讀