0x01缘由:
当需要在不同的服务之间传递状态信息或通知,以及订阅者和发布者的模式时,要使用消息队列。
典型的场景有:
WEB和C后台/Python后台/Java后台传递一些消息时,如配置文件、指令等。
0x02开源程序版本:
msgpack(消息序列化)
:git clone https://github.com/msgpack/msgpack-c.git
hredis(redis c/c++开发接口):https://github.com/gilala/hredis
消息序列化工具还有protobuf,两个各有利弊,
用python语言相当好用,为了尝试使用C++决定尝试用一下。msgpack
0x03动手造轮子(木)的目的:
锻炼动手能力;
了解一些新工具,开阔思路;
复习makefile的编写;
0x04阅读你能获得什么:
- makefile的编写,如何检测.h的变化,不用make clean;
- messagepack c++接口的使用;
- redis c结构的使用;
- 公司产品中得到利用;
0x05 messagepack例子:
/*
* msgpack.cpp
*
* Created on: 2017年5月24日
* Author: Administrator
*/
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <sstream>
#include <msgpack.hpp>
typedef struct item
{
int age;
std::string name;
MSGPACK_DEFINE(age, name);
}Item;
int main()
{
Item data;
data.age = 28;
data.name = "pym";
std::stringstream buffer;
msgpack::pack(buffer, data);
// send the buffer ...
buffer.seekg(0);
// deserialize the buffer into msgpack::object instance.
std::string str(buffer.str());
msgpack::object_handle oh = msgpack::unpack(str.data(), str.size());
// deserialized object is valid during the msgpack::object_handle instance alive.
msgpack::object deserialized = oh.get();
// msgpack::object supports ostream.
std::cout << deserialized << std::endl;
// convert msgpack::object instance into the original type.
// if the type is mismatched, it throws msgpack::type_error exception.
Item dst;
deserialized.convert(dst);
printf("name: %s\nage : %d\n", dst.name.c_str(), dst.age);
return 0;
}
0x05 其他源码:
https://github.com/pangyemeng/redis_message_queue.git0x06 存在几个问题未解决:
rpush key string 为字符串,所以序列化后不能存0字符串结尾的标识;
消息类型中不能存在为0的证书,因为序列化后会为0,导致存入redis后截断;