Skip to content

qinglianghe/kpm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

kpm

这是一个使用python的异步IO编写的,将生产者使用message.proto定义的protobuf的message序列化后、写入到kafka中。消费者从kafka中获取message、进行protobuf的反序列化后、通过ORM框架将数据保存到MySQL对应的数据表中。

如图:

kpm.jpg

message.proto

message.proto定义protobuf序列化和反序列化的message

message_pb2.py

message_pb2.py是由message.proto使用protobuf工具生成的对应message的python代码

message.py

message.py定义protobuf message对应的类:提供反序列化、通过调用orm的保存数据到MySQL中的接口。

models.py

models.py定义数据表对应的类,类中的每个字段对应于数据表的字段。

orm.py

orm.py使用aiomysql实现的ORM框架,将MySQL数据库的一行记录映射为一个对象,一个类对应一个表,写代码更简单,不用直接操作SQL语句:

  • 调用create_pool创建对应的数据库连接池

  • Field相关的类,负责保存数据库表的字段名和字段类型

  • ModelMetaclass元类,负责保存属性和列的映射关系、表名、主键名、以及对应的增、删、改、查的sql语句

  • Model定义各种操作数据库的方法,比如savedeleteupdatefind

配置

consumer.py

consumer.py定义的消费者:

  • 使用异步IO,根据配置创建mysql的连接池和kafka的连接

  • 从kafka中消费数据,根据对应message的key反序列化protohuf的message,最后通过ORM框架将数据保存中对应的数据表中

producer_test.py

producer_test.py用于生成测试数据,将序列化的protobuf数据写入kafka中

运行环境

  • Python 3.5.2
  • MySql 5.6.0
  • protobuf 3.0
  • aiokafka
  • aiomysql

测试

生成数据库和数据表

mysql -u root -p < schema.sql

sql脚本导入成功后,会生成test数据库、users表、blogs表、comments表。

编译 transmitted_message.proto 文件

protoc --python_out=. message.proto 

编译成功后,会在当前目录下生成一个message_pb2.py文件。

生成测试数据

python3 producer.py

操作成功后,会往kafka发送测试的数据,并在当前目录下生成一个md5.info文件。

保存到数据库

python3 consumer.py

操作成功后,会从kafka中读取数据,反序列化后,通过ORM框架写入到对应的数据表中。

检查数据的完整性

python3 check_md5.py

如果数据库中的所有的记录的md5与测试时生成的md5.info相同,则会输出:

test data is complete in the database.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages