kafka学习笔记总结

2023-10-31

kafka学习笔记总结

参考:
http://orchome.com/kafka/index
https://blog.csdn.net/qq_24084925/article/details/78842844

角色说明
Message
    通信的基本单位,每个 producer 可以向一个 topic(主题)发布一些消息。
Producer
    消息生产者,是消息的产生的源头,负责生成消息并发送到Kafka 服务器上。
Consumer
    消息消费者,是消息的使用方,负责消费Kafka服务器上的消息。
Consumer group:
  high-level consumer API 中,每个 consumer 都属于一个 consumer group,每条消息只能被 consumer group 中的一个 Consumer 消费,但可以被多个 consumer group 消费。
Topic
    主题,由用户定义并配置在Kafka服务器,用于建立生产者和消息者之间的订阅关系:生产者发送消息到指定的Topic下,消息者从这个Topic下消费消息。
Broker
    即Kafka的服务器,用户存储消息,Kafa集群中的一台或多台服务器统称为 broker
Group
    消费者分组,用于归组同类消费者,在Kafka中,多个消费者可以共同消费一个Topic下的消息,每个消费者消费其中的部分消息,这些消费者就组成了一个分组,拥有同一个分组名称,通常也被称为消费者集群。
Offset
    消息存储在Kafka的Broker上,消费者拉取消息数据的过程中需要知道消息在文件中的偏移量,这个偏移量就是所谓的Offset。
partition:
    kafka 分配的单位是 partition。
  partition 是物理上的概念,每个 topic 包含一个或多个 partition。
    一个 topic可以分为多个 partition,每个 partition 是一个有序的队列。
    partition中的每条消息都会被分配一个有序的 id(offset)
replica:
  partition 的副本,保障 partition 的高可用。
leader:
  replica 中的一个角色, producer 和 consumer 只跟 leader 交互。
    Leader 是负责给定分区的所有读取和写入的节点。 
    每个分区都有一个服务器充当Leader
follower:
  replica 中的一个角色,从 leader 中复制数据。
controller:
  kafka 集群中的其中一个服务器,用来进行 leader election 以及 各种 failover。
zookeeper:
  kafka 通过 zookeeper 来存储集群的 meta 信息。
概念

我们认为,一个流处理平台具有三个关键能力:

发布和订阅消息(流),在这方面,它类似于一个消息队列或企业消息系统;
以容错的方式存储消息(流);
在消息流发生时处理它们;

kafka应用于2大类应用:

构建实时的流数据管道,可靠地获取系统和应用程序之间的数据。
构建实时流的应用程序,对数据流进行转换或反应

一些基本概念(The high-level consumer API):

  1. kafka作为一个集群运行在一个或多个服务器上

  2. kafka集群存储的消息是以topic为类别记录的,不同的topic之间是相互独立的

  3. Message在Broker中通过Log追加的方式进行持久化存储,并进行分区(patitions)

  4. 为了减少磁盘写入的次数,broker会将消息暂时buffer起来,当消息的个数(或尺寸)达到一定阀值时,再flush到磁盘,这样减少了磁盘IO调用的次数

  5. 无状态导致消息的删除成为难题(可能删除的消息正在被订阅),kafka采用基于时间的SLA(服务水平保证),消息保存一定时间后会被删除

  6. 消息订阅者可以rewind back到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset(id)进行重新读取消费消息

  7. 每个topic可以分成几个不同的partition(每个topic有几个partition是在创建topic时指定的),每个partition存储一部分Message。

  8. partition中的每条Message包含了以下三个属性:

    offset 即:消息唯一标识:对应类型:long
    MessageSize 对应类型:int32
    data 是message的具体内容。

  9. kafka 的分配单位是 patition,每个 consumer 都属于一个 group,一个 partition 只能被同一个 group 内的一个 consumer 所消费;
    保障了一个消息只能被 group 内的一个 consuemr 所消费,但是多个 group 可以同时消费这个 partition;

  10. 一个consumer可以消费多个partitions中的消息(消费者数据小于Partions的数量时),consumer 采用 pull 模式从 broker 中读取数据;

  11. kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息;

  12. 一个Topic可以认为是一类消息,每个topic将被分成多partition(区),每个partition在存储层面是append log文件;

  13. partition是以文件的形式存储在文件系统中的,任何发布到此partition的消息都会被直接追加到log文件的尾部 - 属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障 kafka 吞吐率)

  14. partition的数据文件索引基于稀疏存储,每隔一定字节的数据建立一条索引;

  15. 分区中的消息都被分了一个序列号,称之为偏移量(offset),在每个分区中此偏移量都是唯一的(Kafka 保证一个 Partition 内的消息的有序性);

通讯过程:

客户端打开与服务器端的Socket
往Socket写入一个int32的数字(数字表示这次发送的Request有多少字节)
服务器端先读出一个int32的整数从而获取这次Request的大小
然后读取对应字节数的数据从而得到Request的具体内容
服务器端处理了请求后,也用同样的方式来发送响应。

kafka有四个核心API:

应用程序使用 Producer API 发布消息到1个或多个topic(主题)。
应用程序使用 Consumer API 来订阅一个或多个topic,并处理产生的消息。
应用程序使用 Streams API 充当一个流处理器,从1个或多个topic消费输入流,并生产一个输出流到1个或多个输出topic,有效地将输入流转换到输出流。
Connector API允许构建或运行可重复使用的生产者或消费者,将topic连接到现有的应用程序或数据系统。例如,一个关系数据库的连接器可捕获每一个变化。

工作流程

消费模式:

The high-level consumer API

high-level consumer API 提供了 consumer group 的语义;
一个消息只能被 group 内的一个 consumer 所消费,且 consumer 消费消息时不关注 offset,最后一个 offset 由 zookeeper 保存。

The SimpleConsumer API

如果你想要对 patition 有更多的控制权,那就应该使用 SimpleConsumer API,比如:
    1. 多次读取一个消息
    2. 只消费一个 patition 中的部分消息
    3. 使用事务来保证一个消息仅被消费一次
但是使用此 API 时,partition、offset、broker、leader 等对你不再透明,需要自己去管理。你需要做大量的额外工作:
    1. 必须在应用程序中跟踪 offset,从而确定下一条应该消费哪条消息
    2. 应用程序需要通过程序获知每个 Partition 的 leader 是谁
    3. 需要处理 leader 的变更
使用 SimpleConsumer API 的一般流程如下:
    1. 查找到一个“活着”的 broker,并且找出每个 partition 的 leader
    2. 找出每个 partition 的 follower
    3. 定义好请求,该请求应该能描述应用程序需要哪些数据
    4. fetch 数据
    5. 识别 leader 的变化,并对之作出必要的响应

发布-订阅消息的工作流程(The high-level consumer API)

    生产者定期向主题发送消息。
    Kafka代理存储为该特定主题配置的分区中的所有消息。 它确保消息在分区之间平等共享。 如果生产者发送两个消息并且有两个分区,Kafka将在第一分区中存储一个消息,在第二分区中存储第二个消息。
    消费者订阅特定主题。
    一旦消费者订阅主题,Kafka将向消费者提供主题的当前偏移,并且还将偏移保存在Zookeeper系综中。
    消费者将定期请求Kafka新消息。
    一旦Kafka收到来自生产者的消息,它将这些消息转发给消费者。
    消费者将收到消息并进行处理。
    一旦消息被处理,消费者将向Kafka代理发送确认。
    一旦Kafka收到确认,它将偏移更改为新值,并在Zookeeper中更新它。 由于偏移在Zookeeper中维护,消费者可以正确地读取下一封邮件。
    以上流程将重复,直到消费者停止请求。
    消费者可以随时回退/跳到所需的主题偏移量,并阅读所有后续消息。

订阅具有相同 Group ID 的主题的消费者被认为是单个组,并且消息在它们之间共享。 让我们检查这个系统的实际工作流程:

队列消息/用户组的工作流(The high-level consumer API)

    生产者以固定间隔向某个主题发送消息。
    Kafka存储在为该特定主题配置的分区中的所有消息,类似于前面的方案。
    单个消费者订阅特定主题,假设 Topic ID为Topic-01,Group ID 为 Group-1 。
    Kafka以与发布 - 订阅消息相同的方式与消费者交互,直到新消费者以相同的组ID 订阅相同主题 Topic-01  1 。
    一旦新消费者到达,Kafka将其操作切换到共享模式,并在两个消费者之间共享数据。 此共享将继续,直到用户数达到为该特定主题配置的分区数。
    一旦消费者的数量超过分区的数量,新消费者将不会接收任何进一步的消息,直到现有消费者取消订阅。 出现这种情况是因为Kafka中的每个消费者将被分配至少一个分区(一个分区同时最多分配给一个消费者),并且一旦所有分区被分配给现有消费者,新消费者将必须等待。
    此功能也称为消费者组。

ZooKeeper的作用

    Apache Kafka的一个关键依赖是Apache Zookeeper,它是一个分布式配置和同步服务。 Zookeeper是Kafka代理和消费者之间的协调接口。 Kafka服务器通过Zookeeper集群共享信息。 Kafka在Zookeeper中存储基本元数据,例如关于主题,代理,消费者偏移(队列读取器)等的信息。
    由于所有关键信息存储在Zookeeper中,并且它通常在其整体上复制此数据,因此Kafka代理/ Zookeeper的故障不会影响Kafka集群的状态。 Kafka将恢复状态,一旦Zookeeper重新启动。 这为Kafka带来了零停机时间。 Kafka代理之间的领导者选举也通过使用Zookeeper在领导者失败的情况下完成。

这里写图片描述

Topic创建、删除流程

//创建
1. controller 在 ZooKeeper 的 /brokers/topics 节点上注册 watcher,当 topic 被创建,则 controller 会通过 watch 得到该 topic 的 partition/replica 分配。
2. controller从 /brokers/ids 读取当前所有可用的 broker 列表,对于 set_p 中的每一个 partition:
2.1 从分配给该 partition 的所有 replica(称为AR)中任选一个可用的 broker 作为新的 leader,并将AR设置为新的 ISR
2.2 将新的 leader 和 ISR 写入 /brokers/topics/[topic]/partitions/[partition]/state
3. controller 通过 RPC 向相关的 broker 发送 LeaderAndISRRequest

//删除
1. controller 在 zooKeeper 的 /brokers/topics 节点上注册 watcher,当 topic 被删除,则 controller 会通过 watch 得到该 topic 的 partition/replica 分配。
2. 若 delete.topic.enable=false,结束;否则 controller 注册在 /admin/delete_topics 上的 watch 被 fire,controller 通过回调向对应的 broker 发送 StopReplicaRequest。

写入流程
  1. producer 先从 zookeeper 的 “/brokers/…/state” 节点找到该 partition 的 leader
  2. producer 将消息发送给该 leader
  3. leader 将消息写入本地 log
  4. followers 从 leader pull 消息,写入本地 log 后 leader 发送 ACK
  5. leader 收到所有 ISR 中的 replica 的 ACK 后,增加 HW(high watermark,最后 commit 的 offset) 并向 producer 发送 ACK
数据传输的事务定义
  1. At most once 消息可能会丢,但绝不会重复传输
  2. At least one 消息绝不会丢,但可能会重复传输
  3. Exactly once 每条消息肯定会被传输一次且仅传输一次

当 producer 向 broker 发送消息时,一旦这条消息被 commit,由于 replication 的存在,它就不会丢;
但是如果 producer 发送数据给 broker 后,遇到网络问题而造成通信中断,那 Producer 就无法判断该条消息是否已经 commit;
虽然 Kafka 无法确定网络故障期间发生了什么,但是 producer 可以生成一种类似于主键的东西,发生故障时幂等性的重试多次,这样就做到了 Exactly once,但目前还并未实现;
所以目前默认情况下一条消息从 producer 到 broker 是确保了 At least once,可通过设置 producer 异步发送实现At most once。

kafka-php使用

参考:
https://github.com/weiboad/kafka-php/blob/master/README_CH.md
https://github.com/weiboad/kafka-php/blob/master/docs/ch/Configure.md

使用 Composer 安装

    添加 composer 依赖 nmred/kafka-php 到项目的 composer.json 文件中即可,如:

    {
        "require": {
            "nmred/kafka-php": "0.2.*"
        }
    }

Produce:

异步回调方式调用

<?php
    require '../vendor/autoload.php';
    date_default_timezone_set('PRC');
    use Monolog\Logger;
    use Monolog\Handler\StdoutHandler;
    // Create the logger
    $logger = new Logger('my_logger');
    // Now add some handlers
    $logger->pushHandler(new StdoutHandler());

    $config = \Kafka\ProducerConfig::getInstance();
    $config->setMetadataRefreshIntervalMs(10000);
    $config->setMetadataBrokerList('10.13.4.159:9192');
    $config->setBrokerVersion('0.9.0.1');
    $config->setRequiredAck(1);
    $config->setIsAsyn(false);
    $config->setProduceInterval(500);
    $producer = new \Kafka\Producer(function() {
        return array(
            array(
                'topic' => 'test',
                'value' => 'test....message.',
                'key' => 'testkey',
            ),
        );
    });
    $producer->setLogger($logger);
    $producer->success(function($result) {
        var_dump($result);
    });
    $producer->error(function($errorCode) {
        var_dump($errorCode);
    });
    $producer->send(true);

同步方式调用

<?php
    require '../vendor/autoload.php';
    date_default_timezone_set('PRC');
    use Monolog\Logger;
    use Monolog\Handler\StdoutHandler;
    // Create the logger
    $logger = new Logger('my_logger');
    // Now add some handlers
    $logger->pushHandler(new StdoutHandler());

    $config = \Kafka\ProducerConfig::getInstance();
    $config->setMetadataRefreshIntervalMs(10000);
    $config->setMetadataBrokerList('127.0.0.1:9192');
    $config->setBrokerVersion('0.9.0.1');
    $config->setRequiredAck(1);
    $config->setIsAsyn(false);
    $config->setProduceInterval(500);
    $producer = new \Kafka\Producer();
    $producer->setLogger($logger);

    for($i = 0; $i < 100; $i++) {
            $result = $producer->send(array(
                    array(
                            'topic' => 'test1',
                            'value' => 'test1....message.',
                            'key' => '',
                    ),
            ));
            var_dump($result);
    }

Consumer

<?php
    require '../vendor/autoload.php';
    date_default_timezone_set('PRC');
    use Monolog\Logger;
    use Monolog\Handler\StdoutHandler;
    // Create the logger
    $logger = new Logger('my_logger');
    // Now add some handlers
    $logger->pushHandler(new StdoutHandler());

    $config = \Kafka\ConsumerConfig::getInstance();
    $config->setMetadataRefreshIntervalMs(10000);
    $config->setMetadataBrokerList('10.13.4.159:9192');
    $config->setGroupId('test');
    $config->setBrokerVersion('0.9.0.1');
    $config->setTopics(array('test'));
    //$config->setOffsetReset('earliest');
    $consumer = new \Kafka\Consumer();
    $consumer->setLogger($logger);
    $consumer->start(function($topic, $part, $message) {
        var_dump($message);
    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kafka学习笔记总结 的相关文章

  • 纠正装饰器模式的一个大缺点

    不久前 我在重构一些游戏战斗代码时决定尝试装饰器模式 战斗者可以拥有各种被动能力 也可能是不同类型的生物 我认为装饰器可以让我在运行时以各种组合添加行为 因此我不需要数百个子类 我几乎已经完成了 15 个左右的被动能力装饰器 在测试中我发现
  • 使用 Laravel 4 验证多个文件上传

    如何在 Laravel 4 中验证上传文件的数组 我已将其设置为允许多个文件 并且已测试这些文件是否存在于 Input file files 数组中 但如何验证每个文件呢 这是我尝试过的 notesData array date gt In
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • 搜索引擎如何找到相关内容? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Google 在解析网络时如何找到相关内容 例如 Google 使用 PHP 原生 DOM 库来解析内
  • 简单的 PHP 条件帮助: if($Var1 = in list($List) and $Cond2) - 这可能吗?

    这是一个可能的功能吗 我需要检查一个变量是否存在于我需要检查的变量列表中 并且 cond2 是否为 true 例如 if row name 1 2 3 Cond2 doThis 它对我不起作用 我在复制粘贴中更改的只是我的列表和变量名称 i
  • Laravel 从 5.6 升级到 Laravel 6

    我有一个项目https github com javedbaloch4 Laravel Booking https github com javedbaloch4 Laravel Booking发展于Laravel 5 6现在我想将其升级到
  • 单词之间没有空格的语言(例如亚洲语言)中的断词?

    我想让 MySQL 全文搜索适用于日语和中文文本以及任何其他语言 问题在于这些语言以及可能其他语言通常在单词之间没有空格 当您必须键入与文本中相同的句子时 搜索没有用 我不能只在每个字符之间添加空格 因为英语也必须有效 我想用 PHP 或
  • 如何检查PHP变量是否包含非数字?

    我只是想知道检查 PHP 变量中是否有非数字的方法以及它是否也检测字符之间的空格 需要确保我的表单字段中没有添加任何奇怪的内容 提前致谢 如果您的意思是您只想要一个包含数字的值 那么您可以使用ctype digit http php net
  • 如何在响应ajax codeigniter后停止执行其他控制器

    我想知道如何在响应输出 json 数据后停止执行函数和涉及的其他控制器 就我这里的情况而言 我只是打电话test 函数于dashboard控制器 In dashboard构造函数将执行MY Login library In MY Login
  • 如何从父类函数访问子类中定义的常量?

    我从 php net 看到这个例子 但 c MY CONST 仅在 5 3
  • PHP严格标准:声明应该兼容

    我有以下类层次结构 class O Base class O extends O Base abstract class A Abstract public function save O Base obj class A extends
  • 为什么我需要结束 ob_start()?

    php 文档建议我应该用 ob end flush 结束每个 ob start 我在网站的每个页面上使用一个 只是为了允许我在应用程序中的任何位置使用 firephp 日志方法 该应用程序运行良好 但我想知道是否有任何我不知道的东西可能有害
  • 使用 SSL 证书验证 Web 浏览器

    是否可以使用 ssl 证书对 Web 浏览器进行身份验证 假设我在应用程序中存储私钥 有什么方法可以从浏览器读取密钥并尝试基于该私钥进行身份验证 您可以使用 SSL TLS 客户端证书身份验证来对浏览器 用户进行身份验证 服务器必须请求客户
  • Woocommerce 结账自定义选择字段

    我有以下功能 将选择列表添加到 woo commerce 结账表单中 woocommerce form field airport pickup array type gt select class gt array airport pic
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • php 错误 fopen(): 文件名不能为空

    发送带有附件代码的电子邮件工作正常 最近我们已将文件传输到另一个托管服务器 idk 发生了什么 它显示以下错误 警告 fopen 第 106 行 home hugerecruitmetnt public html validatecva p
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val

随机推荐

  • CoreData之MagicalRecord源码解读

    CoreData之MagicalRecord源码解读 CoreData 与SQLite 说到数据持久化 很难让人不想到又爱又恨的CoreData 说到CoreData可能大多数人就是想到的繁琐 最直接的原因就是使用CoreData涉及的类特
  • “极狐•华为HI版本”的尴尬与困境

    2021年4月上海汽车展 发生了一起震惊中国汽车界的营销事件 华为在车展的前4天 4月15日 发布了一段高级辅助驾驶的演示视频 图1 在4月15日发布的视频中 2块显示屏叠在一起 告诉我们这是测试车 这个视频当中 汽车的内饰是和普通的电动轿
  • Qt程序的打包案例

    1 在Qt内构建并运行release 2 在运行后生成的文件夹中找到 exe后缀文件 然后复制 到桌面创建一个新文件夹 如login文件夹 3 在桌面创建一个文件夹 名字可以随意取 equip system 把刚复制的exe粘贴到里边 4
  • Flink主要组件以及工作流程

    Flink简介 Flink 是一个框架和分布式处理引擎 用于对无界和有界数据流 批处理和流处理 进行有状态计算 并且 Flink 提供了数据分布 容错机制以及资源管理等核心功能 Flink提供了诸多高抽象层的API以便用户编写分布式任务 D
  • 基于深度学习的无人驾驶道路检测

    最近在自学深度学习 网上有很多计算机视觉比赛和资源 比如kaggle 天池 百度飞浆 paddle现在做得越来越好 于是我就选择了百度飞浆 支持国产开源框架 也自己跑通了代码 以此记录一下学习过程 若有纰漏 恳请各位大佬多多指点 目录 一
  • EasyExcel导出案例(只有你想不到)

  • 红黑、B、B+————数据结构//复习复习复习

    二叉排序树 树型操作鼻祖 其他树的增删查都如此 平衡二叉树 查找效率最高 但维护成本高 对平衡二叉树的插入操作而言 其本质上比二叉排序树 BST 的插入操作多了一个平衡操作 解决了二叉排序树插入操作可能出现的斜树 不平衡问题 我们以插入一个
  • 【Python】刷题常用语法汇总

    Python刷题常用语法汇总 一 字符串操作 字符串是不可更改的对象 因此无法直接修改字符串的某一位字符 一种可行的方式是 将字符串转换为列表 修改列表的元素后 再重新连接为字符串 s thisisastring l list s l 0
  • Java代码实现本地创建文件,读取文件,删除指定目录下的文件

    目录 一 需求 二 实现 1 完成创建文件 写入文件 2 读取文件 3 删除文件 测试 注意 java的split方法分割字符串 分隔符如 及注意点 一 需求 1 创建文件夹 以规定格式保存信息到指定文件 并存放在相应目录下 2 在保存的目
  • 第一次实验:Protocol Layers

    第一次实验 Protocol Layers 捕获跟踪 Pick a URL and fetch it with wget or curl 检查跟踪 数据包结构 协议开销 复用密钥 Which Ethernet header field is
  • 服务器出现TIME_WAIT和CLOSE_WAIT的原因以及解决方法

    来自 http blog csdn net shootyou article details 6622226 昨天解决了一个HttpClient调用错误导致的服务器异常 具体过程如下 http blog csdn net shootyou
  • SpringBoot(一)——注解配置

    文章目录 一 简介 1 概述 2 特性 3 四大核心 二 搭建环境 三 入门小程序 HelloWorld 四 配置文件 1 YML文件 2 YML语法 lt 1 gt 基本语法 lt 2 gt 值的写法 1 字面量 数字 字符串 布尔 2
  • PLSQL Developer 代码助手卡顿优化

    支持付费优化 原因分析 代码助手卡顿来源于 不考虑网络和软件版本等影响 A 从已连接的数据库的数据字典中 读取该表的列信息 B 将读取到的列信息返回到plsql编辑器 并进行字符处理 然后显示 如何优化B 这个勾勾是维持IDE的代码和数据库
  • TCP/IP常见协议及协议号及端口号

    TCP IP常见协议及协议号及端口号 协议 ICMP 1 Internet控制报文协议 IGMP 2 Internet组管理协议 TCP 6 传输控制协议 EGP 8 外部网关协议 IGP 9 专用内部网关协议 UDP 17 用户数据报协议
  • 浅谈编程语言的函数与方法

    在编程中 函数 Function 和方法 Method 是非常重要的概念 都是在编程中用来执行特定功能的代码块 可以被调用或重复使用 从而提高代码的可读性 可维护性和重用性 函数 函数是一个独立的代码片段 它实现特定功能并返回结果 它可以独
  • muduo库源码分析和总结

    陈硕大神的muduo库设计巧 但是难读懂 这里简单做个总结 注意回调函数太多 需仔细研究回调的传递和调用 两个核心梳理主线 EventLoopThreadPool start EventLoop runInLoop 其次陈硕认为网络编程的本
  • 适合大学生兼职做的8个副业推荐

    说起在大学兼职赚钱 我总结了8个适合大学生的兼职方式 毕竟在大学想要自己的生活更精彩一点 仅靠家里给的生活费是显然不够的 如果你正在寻找一些适合大学生的兼职 那么以下这些兼职可能会是不错的选择 1 淘宝兼职设计 如果你的专业与设计有关 那么
  • java可变参数(不定向参数)

    java可变参数的作用 在编写方法的过程中 可能会遇见一个方法有不确定参数个数的情况 一般我们会用方法重载来解决问题 1 方法重载 解决参数个数不确定问题 2 public void method 3 public void method
  • python-selenium运行报chromedriver与chrome不匹配解决方案

    selenium common exceptions SessionNotCreatedException Message session not created This version of ChromeDriver only supp
  • kafka学习笔记总结

    kafka学习笔记总结 参考 http orchome com kafka index https blog csdn net qq 24084925 article details 78842844 角色说明 Message 通信的基本单