thrift 实战 —— 一个简单的匹配系统(上)

简介: thrift 实战 —— 一个简单的匹配系统(上)

前言


上文,我们实现了一个基本的接口 match.thrift


namespace cpp match_service
struct User {
  1: i32 id,
  2: string name,
  3: i32 score
}
service Match {
  i32 add_user(1: User user, 2: string info),
  i32 remove_user(1: User user, 2: string info),
}
复制代码


基于这个接口我们可以实现一个如图的简单匹配系统:


image.png


用 python 作为客户端远程调用进行用户的添加或者删除,cpp 作为服务端进行用户的匹配,虽然省略了数据存储,但也算是一个最小的匹配系统的实现。


生成


通过 match.thrift 分别生成 python 和 cpp 代码:


thrift -r --gen cpp match.thrift
thrift -r --gen py match.thrift
复制代码


生成的代码分别放置在 gen-cpp 以及 gen-py 文件夹下, 我们重新梳理一下文件结构:


mv gen-cpp match_server
mv gen-py match_client
cd match_server
mv Match_server.skeleton.cpp main.cpp
cd ../match_client/match
rm Match-remote


image.png


基本功能


上篇文章 一样,我们先测试跑通:


// match_server/main.cpp
...
#include <iostream>
...
class MatchHandler : virtual public MatchIf {
 public:
  ...
  int32_t add_user(const User& user, const std::string& info) {
    printf("add_user\n");
    // 添加了 return 0
    return 0;
  }
  int32_t remove_user(const User& user, const std::string& info) {
    printf("remove_user\n");
    // 添加了 return 0
    return 0;
  }
};
int main(int argc, char **argv) {
  ...
  TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
  // 输出测试
  std::cout << "Start match server 😎" << std::endl;
  server.serve();
  return 0;
}
复制代码


测试,看到输出证明成功:


# 编译,连接,运行
g++ -c *.cpp
g++ *.o -o main -lthrift
./main
复制代码


然后是客户端代码,新建 client.py,参考官方示例


from match import Match
from match.ttypes import User
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
def main():
    # Make socket
    transport = TSocket.TSocket('localhost', 9090)
    # Buffering is critical. Raw sockets are very slow
    transport = TTransport.TBufferedTransport(transport)
    # Wrap in a protocol
    protocol = TBinaryProtocol.TBinaryProtocol(transport)
    # Create a client to use the protocol encoder
    client = Match.Client(protocol)
    # Connect!
    transport.open()
    # 测试
    user = User(1, "mancuoj", 1500)
    client.add_user(user, "")
    # Close!
    transport.close()
if __name__=="__main__":
    main()
复制代码


开启服务端,然后运行 client.py,你会看到如图的输出:

image.png

具体代码可以查看github,骨架已经搭好,下篇我们继续😎

目录
相关文章
|
6月前
|
数据采集 算法 Java
Java 正则表达式【匹配与分组基本原理】
Java 正则表达式【匹配与分组基本原理】
|
6月前
|
Java API Apache
ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)
【4月更文挑战第11天】ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)
70 11
|
12月前
|
JSON 自然语言处理 数据格式
分布式系列教程(33) -ElasticSearch DSL语言查询与过滤
分布式系列教程(33) -ElasticSearch DSL语言查询与过滤
194 0
|
6月前
|
Kubernetes Java 数据库连接
Flink问题之自定义分隔符写入如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
SQL 自然语言处理 索引
DSL的诞生 | 复杂sql转成Elasticsearch DSL深入详解
源自死磕ElasticsearchQQ群(626036393)中的一个问题: 问题如下: where (position=ES or work=ES or content=ES) and academic=本科 and (city=北京 or city=深圳) 1 怎么构建ES的查询条件? 我的问题拆解与实现如下:
1757 0
DSL的诞生 | 复杂sql转成Elasticsearch DSL深入详解
|
缓存 索引
白话Elasticsearch02- 结构化搜索之filter执行原理bitset机制与caching机制
白话Elasticsearch02- 结构化搜索之filter执行原理bitset机制与caching机制
94 0
|
消息中间件
thrift 实战 —— 一个简单的匹配系统(下)
thrift 实战 —— 一个简单的匹配系统(下)
261 0
thrift 实战 —— 一个简单的匹配系统(下)
|
编译器 Apache
Thrift架构与使用方法
Thrift架构与使用方法
254 0
Thrift架构与使用方法
|
存储 自然语言处理 索引
深究|Elasticsearch单字段支持的最大字符数?
在业务系统中,遇到过两个问题: 问题1:设置为keyword类型的字段,插入很长的大段内容后,报字符超出异常,无法插入。 问题2:检索超过ignore_above设定长度的字段后,无法返回结果。
562 0
深究|Elasticsearch单字段支持的最大字符数?
|
自然语言处理 索引
Elasticsearch 如何实现查询/聚合不区分大小写?
1、实战问题 最近社区里有多个关于区分大小写的问题: 问题1:ES查询和聚合怎么设置不区分大小写呢? 问题2:ES7.6 如何实现模糊查询不区分大小写? 主要是如何进行分词和mapping的一些设置来实现这个效果, 自己也尝试过对setting 和 mapping字段进行设置,都是报错比较着急, 类似的问题,既然有很多同学问到,那么咱们就有必要梳理出完整的思路和方案。 这或许是铭毅天下公众号的使命所在。 这个问题不复杂,所以本文会言简意赅,直击要害!
852 0
Elasticsearch 如何实现查询/聚合不区分大小写?