Kafka核心技术
Kafka学习了一段时间了,把相关琐碎的笔记整理成一篇文章,大家一起学习趴( •̀ ω •́ )✧
Kafka简要背景互联网行业ABC – AI人工智能,BigData大数据,Cloud云计算云平台· kafka是一个消息引擎,消息引擎则是一组规范,用于在不同系统之间传递语义准确的消息,实现松耦合的异步式数据传输· kafka如何传递消息格式:纯二进制的字节序列传输协议:点对点模型,发布/订阅模型(kafka两种传输模型都支持)· 为什么系统AB之间不直接发送消息,而要经过一个kafka消息引擎呢?削峰填谷!缓冲上下游瞬时突发流量,使其更平滑;松耦合,简化应用的开发,减少了系统间不必要的交互
相关术语
发布订阅的对象是消息,而主题(Topic)是承载消息的逻辑容器,生产者向主题发布消息,消费者订阅主题消息,生产者和消费者都称为客户端。Kafka的服务器由Broker的服务进程构成,一个Kafka集群由多个Broker组成· 备份机制(不丢失消息):Leader Replica(对外提供服务) 和 Follower Replica(异步消息拉取)。· 伸缩性(单机无法容纳大量数据):分区 ...
【2023杂记】聪明人也要下笨功夫
868008f3bb100988c9fdbd36f245c0bce893c7d0a5e690657c77a1857dc6e86e4861a36e7612eb117e44f66cc507db7995fb6384355e41399091e25e8e7fa5ec796c93e74054c91abdc7c9b728812bf1373655a72f9581bc0305a4f0a549f6de915e469335db07f905e36636a45dc04a456642f7dac0d03938f8a8967af7dfaf6575a747627e1c8d8099626ae3e6082890c83003af1e819ea768c4beab2d2ef82f35e60a3ef5c13e00c4794e8fd5dee7085b6eeb1a61147f9bffcd83166bab16c328fb99b52cae3bb1167c5d1964c2dd9f5a593bc1c22bc0d61cad009101656c9b1509dedc403d0d050e3dc43c61870aa265d7abaf620136f ...
【bug】局部数组变量过大导致栈溢出
今天在写代码的时候,偶然发现一个问题:在main函数中定义较大的数组变量,一运行程序就会崩溃。
12345678910111213#include <bits/stdc++.h>using namespace std;const int N = 1010; int main(){ int arr[N][N]; // 运行时错误:segment fault for(int i=1;i<N;++i){ for(int j=1;j<N;++j){ arr[i][j]=i*j; } } return 0;}
但是,当这个数组作为全局变量时,又不会出现这个错误。
12345678910111213#include <bits/stdc++.h>using namespace std;const int N = 1010; int arr[N][N]; // 作为全局变量int main()& ...
Effective C++ (第三版)
研二上这学期真是从头忙到尾呀,后悔自己暑假没有平衡好生活和学习。最近终于搞完了科研任务和一些其他杂事,有时间来沉淀一下自己了。准备把C++路线整个走一遍,以备战明年的实习和校招,加油吧,少年!
之前粗略地记录了C++ primer第五版,就不重复花费时间了。虽然之前也看过effective c++,但当时理解还不够,这次准备重点理解好《effective c++》和《effective stl》这两本书。
🆗,那就一起来揭开,the 55 specific ways to improve your programs and designs. —— Scott Meyers
导读声明(declaration)告诉编译器某个东西的名称和类型。
定义(definition)提供编译器一些声明所遗漏的细节。于对象而言,定义是编译器为此对象拨发内存的地点;于函数而言,定义提供了代码本体。对类class而言,定义列出它们的成员。
初始化(initialization)是“给予对象初值”的过程。对用户自定义类型的对象来说,初始化由构造函数执行。
区别“copy构造”和“copy赋值”
“ ...
【开源项目】为openEuler5.10内核增添页表检查功能
项目背景项目名称openEuler5.10内核支持页表检查功能(page table check)
项目基本需求(1)合入linux社区中页表检查功能的补丁到openEuler5.10中;
(2)将页表检查功能对arm64的支持也添加到openEuler5.10;
(3)对新特性进行一定的测试,并将合入主线已知的bugfix补丁以及可能存在的其他bug进行修复补丁,整理相关的bugfix合入到openEuler5.10。
项目相关仓库OpenEuler: https://gitee.com/openeuler/kernel/tree/openEuler-22.09/
项目产生原因21年11月,一名Google工程师发现linux内核存在一个引用数据下溢(reference count underflow)问题[1-2],而且该问题一直可以追溯到2017年的Linux 4.14内核。该问题会导致无意的页面共享,让内存从一个进程泄露到另一个进程中。为解决此内存缺陷,提出了全新的“页表检查(page table check)”解决方案。
具体问题:https://www.spinics.ne ...
深入探索linux内存管理中的page
Linux内存管理要讨论page,就不得不先说一说linux是如何进行内存管理的(这部分略讲)。
首先,要明白操作系统采用虚拟内存管理来为你的程序制造一个illusion——“我拥有非常大的内存!”
程序中使用的是虚拟地址,然后通过页表(page table)的映射能够找到其对应的物理地址(可能在主存中,也可能在其他存储设备中),页表以及多级页表的诸多概念和操作不在本文所讨论的范畴。
然后,虚拟地址到物理地址之间要映射吧,那就要统一一个大小吧,不然怎么映射。这个统一的大小就称为页(page),也就是所说的分页管理。页是地址连续的一片地址空间,可以是虚拟内存中的,也可以是物理内存中的,而物理内存中的一个页被称为页框(page frame)。
页就是这么个简单的概念:固定大小 (PAGE_SIZE) 的存储空间,内部地址连续。
Page定义及相关操作简单了解了页的概念后,我们把注意力集中在如何在内核代码中使用它。
Page是Linux管理物理内存的最小单位,对于一个4GB的内存,都会有百万个struct page,即使增加一个字节,对系统的影响也很大,所以linux社区对struct p ...
linux下的轻量级同步机制——completion
前言最近想让提交的几个磁盘请求按确定的顺序执行,这亟需一种同步机制来提供这种实现。于是,调研并学习了linux下的一个轻量级线程同步机制——completion.
一般而言,在操作系统的多线程中,你没有办法预测OS是否将为你的线程选择一个正确的顺序。所以在操作共享变量时,需要谨慎,并在必要的时候使用某些机制来同步线程[1]。
该文章仅探讨线程同步机制,具体地,是linux中的completion线程同步机制。
completion内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束。这个活动可能是:创建一个新的内核线程或者新的用户进程、对一个已有进程的某个请求,或者某种类型的硬件动作等[2]。在这种情况下,可以使用很多方式(如信号量)来同步这两个任务。同时,内核中提供了另一种轻量级线程同步机制——completion,它允许一个线程通知另一个线程某个工作已经完成。
具体地,在我的需求中,要求一个线程通过系统调用对硬件设备进行读写访问,并确保一系列读写访问的顺序以及共享变量的正确更新。流程如下:
线程任务在调用系统调用对设备读写/控制后,就等待completi ...