前面提到 Kafka 帮我们实现了各个版本的生产者代码,其实他也可以完全不提供这份代码,因为核心的队列的功能已经实现了,这些客户端的代码也可以完全交由用户自己实现。
那么假如没有官方代码,我们又该实现一些什么功能,有哪些接口,哪些方法,以及如何组织这些代码呢。带着这样的问题我们一起来思考一下!一般对于这种带有数据流转的设计,我会从 由谁产生? 什么数据? 通往哪去? 如何保证通路可靠? 这几个方面来考虑。
消息自然是通过应用程序构造出来并提供给生产者,生产者首先要知道需要将消息发送到哪个 Broker 的哪个 Topic,以及 Topic 的具体 Partition 。那么必然需要配置客户端的 Broker集群地址 ,需要发送的 Topic 名称 ,以及 消息的分区策略 ,是指定到具体的分区还是通过某个 key hash 到不同的分区。
知道了消息要通往哪,还需要知道发送的是什么格式的消息,是字符串还是数字或是被序列化的二进制对象。 消息序列化 将需要消息序列化成字节数组才方便在网络上传输,所以要配置生产者的消息序列化策略,最好是可以通过传递枚举或者类名的方式自动构造序列化器,便于后续序列化过程的扩展。
消息队列常常用于多个系统之间的异步调用,那么这种调用关系就没有强实时依赖。由于发消息到 Kafka 会产生 网络 I/O ,相对来说比较耗时,那么消息发送这一动作除了同步调用, 是否也可以设置为异步,提高生产者的吞吐呢? 。并且大量消息发送场景, 我们可以设置一个窗口,窗口可以是时间维度也可以是消息数量维度,将消息积攒起来批次发送,减少网络 I/O 次数,提高吞吐量。
最后呢为了保证消息可以最大程度的成功发送到 Broker ,我们还需要一些 失败重试机制 ,例如失败后放到重试队列中,隔一段时间尝试再次发送。
通过上面的分析,我们会有一个大致的认识,应该会有哪些方法,以及底层的大致的设计会分为哪几个部分。但是不够清楚,不够明晰。
首先总结一下实现客户端的几个要点在于:
配置 Broker 基础信息:集群地址、Topic、Partition
消息序列化,通过可扩展的序列化器实现
消息异步写入缓冲区,网络 I/O 线程实现消息发送
消息发送的失败重试机制
话不多说,用一张图画出各个核心模块以及他们之间的交互顺序:
IIS Express设置虚拟目录 (UserFile)<site name="WebSite(1)" id="4"> <application path="/" applicationPool="Clr4IntegratedAppPool"> <virtualDirectory path="/" physical
[@more@] ..._dataload命令集
真正意义上的spring环境中的单元测试方案spring-test与mokito完美结合 博客分类: java 测试 单元测试SpringCC++C#一.要解决的问题: spring环境中单元测试其实不是真正意义上的单元测试,真正意义上的单元测试应该是隔离所有的依赖,对当前业务实现业务逻辑测试;但是目前spring好像还没提供这样的解决方案,只能做依赖于环境的集成..._spring集成testng与mockito框架单元测试方法
用指定的 SQL SELECT 语句初始化 OracleDataAdapter 类的新实例。Initializes a new instance of the OracleDataAdapter class with the specified SQL SELECT statement.public:OracleDataAdapter(System::Data::OracleClient::Ora..._oracledataadapter
什么是Occlusion Culling(遮挡剔除)当一个物体被其他物体遮挡住而不在摄像机的可视范围内时不对其进行渲染。在绝大多数情况下离 camera 最远的物体首先被渲染,靠近摄像机的物体后渲染并覆盖先前渲染的物体(这被称为重复渲染"overdraw")。注意区分:遮挡剔除!=视锥体剔除.视锥体剔除(Frustum Culling)只是不渲染摄像机视角范围外的物体,而对于被其他物体遮挡但依然在视角范围内的物体,则不会被剔除。Occlusion Culling原理遮挡剔除的运行将通过在场景中使_unity 清除occlusioncullingdata
之前写过一个关于斯坦福cs321n课程的作业环境搭建教程,cs231n_assignment1_配置作业环境+kNN,不过好像很多人还是在搭建过程中遇到一些问题,导致做不了作业。自己动手实践是学习最快的方法,看公开课独立完成作业非常重要。在邮件中不好详细回复,今天回忆了一下当时的搭建步骤在这里另开一文做一个作业环境搭建的图文详细版,希望能帮助到更多的人。说明:本文适用于希望在Window...
大家好,我是程序员老王。年薪百万老码农,待过一线大厂创过业,带过团队,目前专注于一线技术,分享程序员进阶路上的点滴,帮助大家提升认知,升职加薪最近有粉丝遇到这么个问题:直属领导走了,空降一个新领导,分了很多新活给他,薪资性价比明显低了很多。该不该和新领导提涨薪?怎么提涨薪?其实不仅是新领导,面对熟悉的直属领导,提涨薪也是一件困难的事。作为工作多年的老程序员,今天和大家分享几个我个人的建议:先搞清楚自己价值“提涨薪”不是什么大事,但在和领导谈之前,先搞..._程序员怎么跟领导提涨薪?
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。中文名MV..._mvc模式的view部分表示企业数据和业务规则,并封装了业务逻辑相关的数据以及对
先安装一波插件npm i vue-loader vue-template-compiler -D在webpack.config.js中配置.vue后缀的匹配规则const VueLoaderPlugin = require('vue-loader/lib/plugin');modules.exports = { plugins : [ new VueL...
基本常时命令sudo uname --m 查看自己运行ubuntu是32位还是64位 sudo uname --s 显示内核名字s sudo uname --r 显示内核版本 sudo uname --n 显示网络主机名 sudo uname --p 显示cpu sudo uname -a 查看Ubuntu版本号安装过程中参考博客: http://www.2cto.com/os/201
前言所谓的隐式共享,就是多个对象引用同一数据(参考智能指针),只在修改内容时才创建新的数据副本(即 copy-on-write 写时复制)。大部分 Qt 容器及相关类都是隐式共享的,且提供了 QSharedData 和 QSharedDataPointer 来帮助我们快速地实现自己的隐式共享类(Qt 自带的容器并没有使用该便捷类,是定制化的实现)。原理参照 Qt 文档中的示例,要使用 QSharedDataPointer 实现隐式共享,需要定义两个类。一个类继承自 QSharedData 用于._qshareddatapointer
在大数据时代,很多时候我们需要在网页中显示数据统计报表,从而能很直观地了解数据的走向,开发人员很多时候需要使用图表来表现一些数据。随着Web技术的发展,从传统只能依靠于flash、IE的vml,各个浏览器尚不统一的svg,到如今规范统一的canvas、svg为代表的html5技术,表现点、线、面要素的技术已经越来越规范成熟。我把前端数据可视化分为了五种:1.图表_js 关系图谱