【C++分布式通信性能飞跃】:基于ZeroMQ与Protobuf的4种高效集成方案

边缘计算分布式推理实战:将大模型部署到树莓派与工业盒子集群 分布式推理是一种将大型深度学习模型的计算任务拆分到多个计算节点上协同执行的技术,其核心原理是通过模型并行、流水线并行等策略,将单一设备的计算负载分散,从而解决大模型对算力和内存的苛刻需求。这项技术的核心价值在于能够突破单点硬件限制,实现高吞吐、低延迟的模型服务。在应用场景上,它尤其适用于对实时性、数据隐私和网络带宽有严格要求的边缘计算环境,例如工业物联网、智慧安防和自动驾驶。本文聚焦于将这一技术落地到资源受限的边缘设备,如树莓派AI盒子和工业边缘计算盒子,通过流水线并行的架构设计,让多个弱算力单元协同完成大 阅读详情

第一章:C++分布式通信性能飞跃的背景与挑战

随着现代高性能计算和大规模分布式系统的发展,C++作为底层系统开发的核心语言,在金融交易、实时数据处理和云计算等场景中承担着关键角色。在这些应用中,通信性能直接决定了系统的吞吐量与延迟表现。传统的进程间通信机制如TCP/IP套接字虽通用性强,但在高并发、低延迟需求下暴露出上下文切换开销大、内存拷贝频繁等问题。

性能瓶颈的典型来源

  • 网络协议栈的多层抽象导致额外延迟
  • 序列化与反序列化过程消耗大量CPU资源
  • 锁竞争和线程调度影响并发效率

主流优化方向对比

技术方案延迟(μs)吞吐量(Msg/s)适用场景
TCP Socket50–100~50,000通用远程通信
RDMA (RoCE)1–5>1,000,000数据中心内高速互联
共享内存队列0.1–1>5,000,000同一主机多进程通信

基于零拷贝的通信优化示例


// 使用 mmap 映射共享内存区域实现零拷贝传输
void* shm_addr = mmap(nullptr, SHM_SIZE,
                      PROT_READ | PROT_WRITE,
                      MAP_SHARED, shm_fd, 0);
// 生产者写入数据,消费者直接读取,避免复制
memcpy(static_cast(shm_addr) + offset, data, data_len);
// 通过信号量或原子变量通知对方数据就绪
__atomic_store_n(&ready_flag, 1, __ATOMIC_RELEASE);
该代码展示了如何通过内存映射减少数据拷贝次数,提升通信效率。执行逻辑依赖操作系统提供的共享内存机制,并配合原子操作实现同步,适用于同机多节点间的高性能通信场景。
graph LR A[应用程序] --> B[用户态缓冲区] B --> C[内核协议栈] C --> D[网卡驱动] D --> E[物理网络] style A fill:#f9f,stroke:#333 style E fill:#bbf,stroke:#333

第二章:ZeroMQ核心机制与C++集成实践

2.1 ZeroMQ消息模式解析及其在C++中的实现

ZeroMQ 提供了多种通信模式,适用于不同的分布式场景。其中最常用的包括请求-应答(REQ/REP)、发布-订阅(PUB/SUB)和推送-拉取(PUSH/PULL)。这些模式通过套接字类型进行区分,能够在进程间、线程间或跨网络高效传递消息。
核心消息模式对比
模式套接字对典型用途
REQ/REP客户端/服务端同步远程过程调用
PUB/SUB广播事件通知实时数据分发
PUSH/PULL任务分发与收集并行流水线处理
C++中实现请求-应答模式

#include <zmq.hpp>
// 创建上下文与REQ套接字
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REQ);
socket.connect("tcp://localhost:5555");

// 发送请求
zmq::message_t request(5);
memcpy(request.data(), "Hello", 5);
socket.send(request);

// 接收响应
zmq::message_t reply;
socket.recv(&reply);
上述代码展示了客户端发送“Hello”并等待服务端响应的完整流程。ZMQ_REQ 自动处理请求与应答的顺序,确保每次发送后必须收到一次回复。上下文管理资源,而 TCP 传输保证跨主机通信可靠性。

2.2 基于C++封装ZeroMQ上下文与套接字的最佳实践

在构建高性能分布式系统时,对ZeroMQ的C++封装需兼顾资源管理与线程安全。通过RAII机制管理上下文(`zmq::context_t`)和套接字(`zmq::socket_t`)生命周期,可有效避免资源泄漏。
封装设计原则
  • 将`zmq::context_t`作为单例或共享指针管理,减少上下文创建开销
  • 套接字对象应在构造时绑定/连接,析构时自动关闭
  • 异常安全:确保抛出异常时仍能正确释放ZMQ资源
典型封装代码示例

class ZmqSocket {
    std::shared_ptr<zmq::context_t> ctx;
    zmq::socket_t sock;

public:
    ZmqSocket(int type) : ctx(std::make_shared<zmq::context_t>(1)), 
                          sock(*ctx, type) {}

    void connect(const std::string& endpoint) {
        sock.connect(endpoint.c_str());
    }
};
上述代码中,上下文使用`std::shared_ptr`共享,保证多实例共用同一上下文;`zmq::socket_t`在栈上构造,由RAII自动清理。构造函数传入套接字类型(如`ZMQ_PUB`、`ZMQ_SUB`),提升复用性。

2.3 消息队列与异步通信的高效构建

解耦系统组件
消息队列通过引入中间层实现生产者与消费者的解耦。系统间不再直接调用,而是通过发送消息进行通信,提升可维护性与扩展性。
常见消息模型
  • 点对点模型:消息被单一消费者处理
  • 发布/订阅模型:消息广播至多个订阅者
代码示例:RabbitMQ 发送消息
conn, _ := amqp.Dial("amqp://guest:guest@localhost:5672/")
channel, _ := conn.Channel()
channel.QueueDeclare("task_queue", true, false, false, false, nil)
channel.Publish("", "task_queue", false, false, amqp.Publishing{
  Body: []byte("Hello World"),
})
该代码建立 RabbitMQ 连接并发送消息到持久化队列。参数 Body 携带实际数据,QueueDeclare 确保队列存在且持久化。
性能对比
中间件吞吐量(万TPS)延迟(ms)
Kafka10+2-5
RabbitMQ1-210-20

2.4 多线程环境下ZeroMQ的线程安全设计

ZeroMQ 在多线程环境下的线程安全设计依赖于其上下文(context)模型。每个线程共享同一个 context,但 socket 必须由创建它的线程独占使用,这是 ZeroMQ 实现线程安全的核心原则。
线程与Socket的绑定关系
ZeroMQ 明确规定:一个 socket 只能被创建它的线程使用,不能跨线程共享。线程间通信应通过 context 内部的消息队列完成,而非直接传递 socket。
上下文的线程安全性
context 是线程安全的,允许多个线程并发访问。它负责管理底层 I/O 线程和消息路由,确保多线程环境下数据一致性。
  • 每个线程应创建独立的 socket 实例
  • 共享 context 实现高效资源复用
  • 避免锁竞争,提升并发性能

void *context = zmq_ctx_new();
void *socket = zmq_socket(context, ZMQ_PAIR);
// 此 socket 只能在当前线程中使用
zmq_close(socket);
zmq_ctx_destroy(context);
上述代码中,context 可被多个线程共享,但 socket 必须在创建线程内完成生命周期操作。这种设计规避了复杂的同步机制,通过所有权模型保障线程安全。

2.5 性能调优:批量发送与非阻塞I/O实战

在高并发数据传输场景中,批量发送与非阻塞I/O是提升系统吞吐量的关键手段。通过合并多个请求为单个批次,可显著降低网络开销和系统调用频率。
批量发送实现示例
func (p *Producer) SendBatch(messages []string) error {
    batch := make([][]byte, 0, len(messages))
    for _, msg := range messages {
        batch = append(batch, []byte(msg))
    }
    return p.conn.Write(batch) // 批量写入连接
}
该函数将消息集合打包后一次性提交,减少系统调用次数。参数 messages 表示待发送的消息列表,建议控制批大小在 1KB~64KB 范围内以平衡延迟与吞吐。
非阻塞I/O优化策略
  • 使用 epoll(Linux)或 kqueue(BSD)实现事件驱动
  • 结合协程处理并发连接,避免线程阻塞
  • 设置 socket 为非阻塞模式,利用 IO multiplexing 提升效率

第三章:Protobuf序列化优化与C++服务对接

3.1 Protobuf数据结构设计对序列化性能的影响

Protobuf 的序列化性能高度依赖于数据结构的设计合理性。字段的排列顺序、类型选择以及嵌套层级都会直接影响编码效率与最终字节大小。
字段编号与紧凑性
Protobuf 使用字段编号生成二进制标签,编号越小,编码后占用的字节越少。建议将频繁使用的字段设置为 1–15 范围内的编号,这些编号在 Varint 编码下仅占一个字节。
嵌套结构优化
深层嵌套会增加序列化开销。应尽量扁平化消息结构,减少不必要的子消息层级。

message User {
  int32 id = 1;           // 高频字段,编号小
  string name = 2;
  optional string email = 3;
  repeated Role roles = 4; // 避免嵌套 repeated 消息
}
上述定义中,id 和 name 作为核心字段使用低编号,提升编码效率;repeated Role 若结构简单可考虑展平为基本类型列表,进一步降低解析成本。

3.2 在C++项目中集成Protobuf编译与运行时环境

在C++项目中使用Protocol Buffers,首先需确保已安装`protoc`编译器及Protobuf C++运行时库。可通过包管理器(如vcpkg、conan)或从源码构建完成安装。
项目构建流程配置
使用CMake时,需正确链接Protobuf库并包含生成的头文件。典型配置如下:

find_package(Protobuf REQUIRED)
include_directories(${Protobuf_INCLUDE_DIRS})

protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS example.proto)
add_executable(myapp main.cpp ${PROTO_SRCS} ${PROTO_HDRS})
target_link_libraries(myapp ${Protobuf_LIBRARIES})
上述CMake脚本通过`protobuf_generate_cpp`自动将`.proto`文件编译为C++源码,并将其加入构建目标。`example.proto`会被转换为`example.pb.cc`和`example.pb.h`,供项目直接调用。
依赖管理建议
  • 优先使用静态链接以减少部署复杂度
  • 确保开发与生产环境的Protobuf版本一致,避免序列化兼容性问题
  • 对频繁变更的协议文件,设置独立的编译单元以加快增量构建

3.3 序列化/反序列化开销分析与内存管理策略

性能瓶颈识别
序列化与反序列化在高并发场景下易成为系统瓶颈,尤其当对象结构复杂时,反射操作和临时对象创建将显著增加CPU与内存开销。JSON、Protobuf等格式的处理效率差异明显,需结合数据结构特点选择。
优化策略对比
  • 使用Protobuf替代JSON可减少30%-50%的序列化体积
  • 对象池技术复用缓冲区,降低GC频率
  • 延迟反序列化,仅在访问字段时解码

var bufferPool = sync.Pool{
    New: func() interface{} {
        return new(bytes.Buffer)
    },
}
该代码通过sync.Pool实现缓冲区复用,避免频繁分配内存,有效缓解堆压力,特别适用于短生命周期的序列化任务。
内存分配模式
策略GC影响吞吐提升
直接分配高无
对象池低~40%

第四章:四种高效集成方案深度剖析

4.1 方案一:请求-应答模式下的同步RPC通信

在分布式系统中,请求-应答是最基础的远程过程调用(RPC)通信模式。客户端发起调用后阻塞等待服务端响应,适用于强一致性要求的场景。
核心通信流程
  • 客户端通过代理桩(Stub)发起远程方法调用
  • 请求经序列化后通过网络传输至服务端
  • 服务端骨架(Skeleton)反序列化并执行目标方法
  • 结果返回客户端并唤醒等待线程
典型代码实现
func (c *Client) Call(serviceMethod string, args interface{}, reply interface{}) error {
    conn, _ := net.Dial("tcp", "localhost:8080")
    defer conn.Close()
    // 发送编码后的请求
    gob.NewEncoder(conn).Encode(&Request{serviceMethod, args})
    // 阻塞接收响应
    return gob.NewDecoder(conn).Decode(reply)
}
上述Go语言示例展示了同步调用的核心逻辑:建立TCP连接后,使用gob进行序列化传输,客户端在Decode时持续阻塞直至收到服务端响应,确保请求与应答严格配对。

4.2 方案二:发布-订阅模式实现低延迟事件广播

在高并发系统中,发布-订阅模式成为实现实时事件广播的核心机制。该模式通过解耦消息生产者与消费者,提升系统可扩展性与响应速度。
核心架构设计
使用 Redis 作为消息代理,利用其 PUB/SUB 功能实现毫秒级消息投递。多个订阅者可监听同一频道,确保事件广播的低延迟与高吞吐。
conn := redis.Subscribe("event_channel")
for {
    msg := conn.Receive()
    go handleEvent(msg) // 异步处理事件
}
上述代码建立持久化连接,实时接收并异步处理事件。Redis 的单线程发布机制保证消息顺序,避免竞争。
性能对比
指标轮询模式发布-订阅
平均延迟800ms15ms
系统负载高低

4.3 方案三:推拉模式构建高性能任务分发系统

在高并发场景下,单纯依赖“推”或“拉”模式难以兼顾实时性与系统负载。推拉结合模式通过动态调度机制,在服务端主动推送任务的同时,客户端按能力主动拉取,实现负载均衡与高效吞吐。
核心工作机制
服务端将任务元数据推送到消息队列,客户端根据当前处理能力周期性拉取任务包。该模式避免了推送过载和拉取空转。
  • 推阶段:任务生产者将待处理任务写入Kafka Topic
  • 拉阶段:工作节点消费并确认任务,按QPS限流策略拉取新任务

// 工作节点拉取逻辑示例
func (w *Worker) PullTasks() {
    for {
        tasks := w.broker.FetchPendingTasks(w.Capacity) // 按容量拉取
        for _, task := range tasks {
            go w.Process(task)
        }
        time.Sleep(pullInterval)
    }
}
上述代码中,w.Capacity反映节点实时负载,控制单次拉取数量,防止过载;FetchPendingTasks从消息中间件获取待处理任务,实现按需分发。
性能对比
模式延迟吞吐量资源利用率
纯推低高不稳定
纯拉较高中稳定
推拉结合低高最优

4.4 方案四:混合模式支持多场景分布式协同

在复杂业务场景中,单一同步或异步模式难以满足多样化的协同需求。混合模式通过动态调度机制,融合实时通信与批量处理能力,实现多节点间的高效协作。
数据同步机制
系统根据网络状态和负载情况自动切换同步策略。高优先级任务采用gRPC长连接推送,低延迟保障关键流程;普通任务则归入消息队列异步处理。

// 动态路由示例
if task.Priority > Threshold {
    SendViaGRPC(task) // 实时通道
} else {
    mq.Publish(task)  // 异步队列
}
上述逻辑依据任务优先级分流,Threshold为可配置阈值,实现资源最优分配。
部署拓扑对比
模式延迟吞吐量适用场景
纯同步低中金融交易
纯异步高高日志聚合
混合模式自适应动态优化跨域协同

第五章:未来演进方向与技术生态展望

边缘计算与AI模型的协同部署
随着IoT设备数量激增,将轻量化AI模型部署至边缘节点成为趋势。以TensorFlow Lite为例,可在树莓派上实现实时图像识别:

import tflite_runtime.interpreter as tflite
interpreter = tflite.Interpreter(model_path="model.tflite")
interpreter.allocate_tensors()

input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

# 假设输入为1x224x224x3的RGB图像
input_data = np.array(np.random.randn(1, 224, 224, 3), dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print("预测结果:", output_data)
开源生态的模块化演进
现代开发依赖高度解耦的模块体系。以下为典型微服务架构中组件选型对比:
功能候选技术适用场景
服务发现Consul / Etcd跨云环境一致性要求高
配置管理Spring Cloud Config / ApolloJava生态集成
链路追踪Jaeger / SkyWalking需支持OpenTelemetry协议
开发者工具链的智能化升级
AI驱动的编程助手正深度集成至IDE。GitHub Copilot已在VS Code中实现上下文感知补全,例如输入注释“// 计算斐波那契数列第n项”即可生成对应函数。企业级CI/CD流水线开始引入自动修复建议,结合静态分析工具如SonarQube,在代码提交阶段标记潜在并发问题并推荐sync.Once等Go原生解决方案。
zeromq和protobuf的c++示例代码适合初学者快速了解,上手 zeromq和protobuf的示例代码适合初学者快速了解,上手,后端开发必学的protobuf protobuf版本:libprotoc 3.21.0-rc1 立即下载

相关推荐

zeromq 代理模式的一些问题

NULL 博文链接:https://guozhiwei.iteye.com/blog/1364885

ZeroMQ+Protobuf实现网络通信

ZeroMQ+Protobuf实现网络通信

https://github.com/shaofengzeng/ 1272

ZeroMQ 云时代极速消息通信库(完整版)

讲述ZeroMQ不可多得的中文书籍,推荐大家下载并使用,不要积分。

ZeroMQ+Protobuf实例

使用库版本 zeromq-4.0.3 接收端代码 #include <zmq.h> #include "stdio.h" int main(int argc, char * argv[]) { void * pCtx = NULL; void * pSock = NULL; const char * pAddr = "tcp://*:7766"; ...

$好记性还是要多记录$ 1280

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Python实现支付宝转账接口

由于工作需要使用python开发一个自动转账接口,记录一下开发过程。 首先需要在蚂蚁金服上申请开通开发者账户,有了开发者账户就可以使用沙箱进行开发了。 在开发之前我们需要在沙箱应用中填写密钥,密钥的获取可以使用阿里提供的工具包自动生成。 前期准备工作完成了,接下来是编写代码部分。主要用到了python-alipay-sdk库,使用pip安装即可,如果安装的过程中遇到问题推荐使用Anaconda...

FanMLei的博客 8516

ZMQ简介

ZMQ(ØMQ、ZeroMQ, 0MQ)看起来像是一套嵌入式的网络链接库,是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,但工作起来更像是一个并发式的框架,分散在分布式系统间。它提供的套接字可以在多种协议中传输消息,如线程间、进程间、TCP、广播等。可以使用套接字构建多对多的连接模式,如扇出、发布-订阅、任务分发、请求-应答等。ZMQ的快速足以胜任集群应用产品。它的异步I/O机制能够构建多核应用程序,完成异步消息处理任务。ZMQ有着多语言支持,并能在几乎所有的操作系统

gcs_20210916的博客 1万+

论文学习:Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline

title: “Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline” tags: [“论文评述”, “报告”] date: 2019-08-22 author: 叶慧 mathjax: true 论文:Towards Automated Infograph...

xiaoyehahaha的博客 731

使用Zeromq和protobuf实现的socket通信

本文介绍使用ZeroMQ(下文简称ZMQ),结合protobuf序列化实现客户端和服务端的通信。在之前的一篇文章中介绍了Google的protobuf序列化的使用,以及结合unix环境的socket编程实现简单的客户端到服务端的通信。在接触了zmq之后,尝试使用这个“极速消息通信库”来重构之前的实现。

cjf_wei的博客 1万+

TLSv1.0与TLSv1.1安全漏洞深度解析与实战修复指南

本文深度解析TLSv1.0与TLSv1.1的安全漏洞,包括POODLE和BEAST攻击原理,并提供实战修复指南。通过禁用老旧协议、配置安全加密套件和网络层防护措施,有效提升系统安全性。文章还针对无法立即升级的场景,给出了补偿性防御方案,帮助管理员全面应对传输层安全风险。

weixin_29322855的博客 206

模电专题-MOS管的放大电路分析

在实际应用中,我们经常会使用到功率MOS,这时通常不会将它当成一个开关使用,而是当成一个放大器来使用,那这就需要让其工作在放大状态。参考下图中的mos管的特性曲线,右图中的输出特性曲线中有一根红色的分界线,这个线就是区分mos管工作状态的分界线,在红线的左边,mos管工作在可变电阻区,也就是线性区;在红线的右边mos管工作在恒流区,也就是饱和区。当然,还有一个截止区。本文分析主要运用模电课本中的理论计算验证。

Anitawen的博客 2万+

图像处理中实现 C++ 和 Python 的高效通信——ZeroMQ & protobuf

使用ZeroMQ和protobuf实现图像处理中 C++ 和 Python 的高效通信

old_power的博客 935

ffmpeg中av_read_frame阻塞的原因与解决方案

最近用到ffmpeg,想要av_read_frame立即返回,但是看网上的博客,都没有详细的解说,那就自己看源码。 两种方法: 设置回调打断函数和设置超时 超时,但是如果只设置该参数,依然会在av_read_frame中阻塞, av_dict_set(&inputDic, "stimeout", "2*1000*1000", 0); // milliseconds //打断回调 m_avformatCtx->interrupt_callback.callback = interru

weixin_43360707的博客 1万+

使用ZMQ和protobuf实现C++程序与Python程序的通信

C++与Python的混合编程能充分发挥两者的优势: C++处理高性能计算, Python快速实现业务逻辑. 而实现跨语言协作的核心在于**通信协议**与**数据结构兼容性**. 本文将介绍基于Protobuf的序列化方案与ZMQ通信框架的整合应用, 实现C++程序和python程序同时进行同一个大任务.

t.y.Tang的博客 1432

【Java核心高阶进阶】44-Java8核心新特性

模块十:Java新特性演进 · 第 1 篇Java 8 是 Java 语言历史上最重要的一次发布,它引入的函数式编程范式从根本上改变了 Java 的编码方式。即便到了 JDK 21 的今天,Lambda、Stream、Optional 仍是日常开发的高频工具。本篇将深入这些特性的语法、原理与底层机制,帮助你不仅会用,更知其所以然。

gaochufukanyongren的博客 24

EtherCAT总线运动控制学习笔记(RXXW_Dor)

说到总线控制,就要说到报文、对象字典、PN通信我们大部分会说报文,EtherCAT通信我们常说对象字典,叫法不一样,但是原理基本一致,下面我们简单认识下上面是对象字典。

RXXW_Dor的博客 5429

【高性能通信架构设计】:基于ZeroMQ与Protobuf的Python-Unity工业级实践

解决Python与Unity高效通信难题,本文详解基于ZeroMQ与Protobuf的跨进程架构设计,适用于工业仿真、数字孪生等场景。低延迟、高吞吐,支持多语言扩展,稳定可靠。值得收藏,点击了解实现细节。

InstrFun的博客 967

基于Lstm+transformer的刀具磨损预测实战

基于Lstm+transformer的刀具磨损预测实战

2906

[ZMQ] -- ZMQ通信收发多个Proto数据结构 2

zmq通信收发多个proto消息

qhr_1012的博客 874

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

爬虫RPC服务化:ZeroMQ+Protobuf构建轻量解析服务

RPC(远程过程调用)是分布式系统中实现服务解耦的核心通信范式,其本质是将本地函数调用透明地扩展为跨网络、跨进程的执行。在爬虫工程中,随着解析逻辑日益复杂、多业务线复用需求增强,传统单体爬虫架构面临耦合高、升级难、扩缩容僵化等瓶颈。采用轻量级RPC方案可将CPU密集型解析模块独立为远程服务,显著提升系统可维护性与弹性。ZeroMQ提供无代理、低延迟的消息传输能力,Protobuf保障高效跨语言序列化,二者组合特别适配爬虫场景对性能、部署简洁性与演进可控性的严苛要求。本文聚焦于从零落地一个生产就绪的爬虫解析R

weixin_31421613的博客 205

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

zeromq 利用protobuf通信

利用zeromq进行编程时候,服务器和客户端的通信,利用protobuf时候 之前的项目里面,需要对protobuf进行编码解码

冰焰· 3977

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

以小见大——那些基于 protobuf 的五花八门的 RPC(1)

Google protobuf(http://code.google.com/p/protobuf)提供了 service 关键字来描述 RPC,但没有实现,所以大家都纷纷自制 RPC,仅仅是在 protobuf 官网列出来的,就有十几个(http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns#RPC_Implementations)。它们使用不同的语言、框架的大不同就不用多说了,没想到的是我看了几个之后,发现即使是每个调用的请求和响应包格式都大有不同

赖勇浩的编程私伙局 2万+

zeromq解决了什么问题

http://www.codedump.info/ 很早就听说了zeromq这个项目,当时不太在意. 后来同事kasicass对这个项目做了研究和分享,开始重视起这个项目来. 再后来,就是看到这篇博文:zeromq:云时代最好的通信库>>,下定决心也要看看这个传说的神器. 最开始,考虑的问题是,zeromq和libevent,ACE这样定位的项目有什么区别没有?

Coder 2042

【Loadrunner】 java vuser 采用cmd方式调用python文件,执行zeromq请求和数据protobuf反序列化

        背景:由于第一次接触zeromq,对其了解甚少,于是度娘对其原理了解一番后,就开始了接下来实践“坑”中,首先在LR中,对于用socekt、java、c那种方式来实现,通过抓包对比,以及socekt和c语言可实现,但复杂度有点”呵呵“,而用java开发的zeromq请求脚本(见:实现过程一),实现挺简单,但是在回放脚本时,遇见了我一个”大坑“,由于开发的隐瞒,导致回放的结果总是乱码,...

深圳-雄少(XZee) 962

ZeroMQ接口函数之 :zmq_socket – 创建ZMQ套接字

ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ZeroMQ 官方地址:http://api.zeromq.org/4-0:zmq-socket 翻译:风波 mail : fengbohello@qq.com —————————————————————————————————————   zmq_sock...

weixin_34194087的博客 505
上一篇: 揭秘C++26 std::future新特性:如何高效传递异步结果
下一篇: 【C++26标准前瞻】:std::future取消机制带来的并发编程革命
DevPath
博客等级 码龄1年 179粉丝 2176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值