【kafka】Golang实现分布式Masscan任务调度系统

要求:

        输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。

        命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。

服务端程序:

  1. 从kafka消费者接收扫描任务信息
  2. 通过调用masscan启动探测任务,获取进度和结果信息,进度写入Redis,结果信息写入Kafka。
  3. 要求对启动任务、kafka、整理流程进行封装。
  4. 要求启动2个server端,通过命令行程序下发2个不同网段,可以均匀的分配到2个server上面执行完成。

测试要求:

  1. 启动两个server端程序。
  2. 通过命令行程序下发两个任务,IP不一样。
  3. 看server端程序日志,是否均匀的扫描了两个任务。

     

前置准备:

        安装docker

思路:

1. 系统架构设计

采用生产者-消费者模式:

  • 命令行客户端作为生产者,将扫描任务发布到Kafka
  • 两个服务端实例作为消费者,从Kafka获取任务并执行

2. 关键组件设计

  1. 任务表示

    • 使用JSON格式表示扫描任务,包含:
      • IP范围(单个IP或CIDR格式)
      • 端口范围
      • 扫描带宽限制
      • 任务状态
      • 进度信息
  2. Kafka设计

    • 创建一个主题(如scan-tasks
    • 使用单个分区确保任务顺序性(或根据需求设计分区策略)
    • 考虑使用消费者组实现两个服务端的负载均衡
  3. Redis设计

    • 存储任务进度信息
    • 使用Hash结构存储每个任务的进度百分比
    • 设置适当的TTL防止数据无限增长
  4. 服务端负载均衡

    • 两个服务端加入同一个Kafka消费者组
    • Kafka会自动将任务均匀分配给两个消费者

3. 执行流程

  1. 客户端流程

    • 解析命令行参数(IP范围、端口、带宽)
    • 验证输入格式
    • 创建Kafka生产者
    • 将任务发布到Kafka主题
  2. 服务端流程

    • 初始化Kafka消费者(加入消费者组)
    • 初始化Redis连接
    • 循环消费任务:
      a. 从Kafka获取任务
      b. 更新Redis中任务状态为"running"
      c. 调用masscan执行扫描:
      • 构造masscan命令行参数
      • 启动masscan进程
      • 监控进程输出和退出状态
        d. 实时解析masscan输出,更新Redis中的进度
        e. 扫描完成后:
      • 更新Redis中任务状态为"completed"
      • 将完整结果发布到另一个Kafka主题(如scan-result

4. 关键技术点

  1. Masscan集成

    • 使用exec.Command启动masscan进程
    • 实时解析masscan的标准输出和错误输出
    • 根据输出计算扫描进度
  2. 错误处理

    • 处理无效IP格式
    • 处理masscan执行失败
    • 处理Kafka/Redis连接问题
  3. 日志记录

    • 记录服务端操作日志
    • 记录任务执行状态变化
    • 记录错误信息

5. 测试验证思路

  1. 启动两个服务端实例
  2. 使用客户端提交两个不同网段的任务
  3. 观察:
    • 两个服务端的日志输出
    • 任务是否被均匀分配(一个服务端处理一个任务)
    • 扫描进度是否正确更新
    • 最终结果是否正确输出

6. 扩展考虑

  1. 任务优先级

    • 可以在任务中添加优先级字段
    • 服务端根据优先级处理任务
  2. 任务超时

    • 添加任务超时机制
    • 超时后重新分配任务
  3. 结果存储

    • 可以考虑将结果存入数据库而不仅是Kafka
  4. 水平扩展

    • 设计支持更多服务端实例的扩展方案

这个设计实现了基本的分布式扫描任务调度系统,核心是利用Kafka的消息队列特性实现任务分发,通过消费者组机制实现负载均衡,使用Redis作为共享状态存储。

实现:

        项目结构:
        

         kafka:
         consumer   
        
package kafkaimport ("context""errors""fmt""github.com/IBM/sarama""log""sync"
)type MessageHandler func([]byte) errortype SaramaConsumer struct {client    sarama.ConsumerGrouphandlers  map[string]MessageHandlerready     chan boolctx       context.Contextcancel    context.CancelFuncconsuming sync.WaitGroupmemberId  stringgroupId   string
}func NewKafkaConsumer(brokers []string, groupId string, topic []string) (*SaramaConsumer, error) {config := sarama.NewConfig()config.Version = sarama.V2_5_0_0                      // 使用适当的 Kafka 版本config.Consumer.Offse

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM 和 x86_64是什么关系

什么是 ARM 和 x86_64? 它们都是 CPU 指令集架构(ISA) 指令集架构(Instruction Set Architecture)就是: CPU 能够理解和执行的“语言”和“命令格式”。 类比解释:指令集就像“语言” 类比对…

nginx配置中有无‘‘/’’的区别

在Nginx配置中,location指令末尾的斜杠/和proxy_pass目标地址末尾的斜杠/组合使用会产生显著差异。以下是四种组合的区别详解: ​​核心区别对比表​​ 配置方案匹配规则请求URI传递逻辑实际转发效果示例location /api/ proxy_pass ...701/仅匹配/api/…

系统安全之身份认证

本篇我们对常用的身份认证协议做简要的梳理,包括主流的 HTTP 相关认证协议以及证书密钥对、新兴的 WebAuthn 认证。 HTTP 协议认证 RFC 7235 中定义了 HTTP 协议的认证框架,要求在支持 HTTP 协议的服务器,如果访问服务的身份验证失败&#…

部署http服务

使用flask搭建一个http服务,能够通过本地的另外一个终端访问对应接口,拿到服务端的计算结果 服务端: 创建一个test_http_dtw.py并运行 from flask import Flask, request, jsonifyapp Flask(__name__)# 示例分析函数 def analysis(data):…

WLAN 技术指南:从入门到原理

文章目录 目录 文章目录 前言 一.WLAN 基本概念 有线侧组网概念 AP-AC 组网方式 AC 连接方式 CAPWAP 协议 无线侧组网概念 无线信道 ​编辑 BSS/SSID/BSSID ​编辑 VAP ESS 二.WLAN 组网架构 基本的 WLAN 组网架构 四.WLAN 工作原理 AP 上线 AP 获取 IP 地址阶段 CAP…

语言学习专用AI播放器推荐:LLPlayer

学语言,经常会看大量的比较优秀的视频材料,那么推荐一款语言学习利器,极大提高生产力。 LLPlayer 是一款专为语言学习者设计的独特视频播放器。 它具有许多重要功能,例如可同时显示文本字幕和位图字幕、使用 OpenAI Whisper 自动…

mysql 关联表查询,索引失效

来源表: ##示例 CREATE TABLE order_wide (order_id varchar(33) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 订单ID,member_id int(11) DEFAULT NULL COMMENT 用户ID,content varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 订单标签,PRIMARY KEY (order_…

Oracle DG库手动注册归档日志的两种方法

Oracle DG库手动注册归档日志的两种方法 注册单个归档日志文件注册多个归档日志文件有的时候由于网络或各种原因,Oracle DG库服务器上可能缺少部分归档日志文件,导致DG库的MRP进程一直处于WAIT_FOR_GAP状态。 此时我们可以手动从主库或其他DG拷贝归档日志到当前DG服务器,并…

中小型VUE3项目创建流程相关命令tips

开新项目因为距离上次初始化时间太过久远,忘记初始化命令的有多少? 不得已简要记录一下流程 1. 使用vite构建新项目 1.1 构建 npm create vite@latest my-vue-app --template vue1.2 安装依赖 npm install1.3 启动 npm run dev参考文档 2. 添加需要的插件 2.1 准备工作…

Web后端开发(请求、响应)

目录 请求: Postman: 简单参数: 实体参数: 数组集合参数: 日期参数: Json参数: 路径参数: 响应: 请求响应: 请求:获取请求数据 响应&a…

Excel大厂自动化报表实战(互联网金融-数据分析周报制作上)

这是Excel大厂自动化报表实战第二期--互联网金融-数据分析周报制作上 数据资源已经与这篇博客捆绑,有需要者可以下载通过网盘分享的文件:2.4自动化报表-8月成交数据.xlsx,2.4自动化报表-8月获客数据.csv等2个文件 链接: https://pan.baidu.co…

HTTP 网络协议演进过程

网络协议演进问题,涉及到HTTP版本之间的连接复用优化和协议升级(特别是从HTTP/2到HTTP/3)的核心变化。我们以 HTTP/1.0 到 HTTP/2.0,再到 HTTP/3.0 的演进顺序来详细解释它们在通道复用(TCP/QUIC)上的优化和…

Xsens动捕和Manus数据手套在元宇宙数字人制作中提供解决方案

硬件连接与数据传输 Xsens与Manus集成:Xsens惯性动作捕捉系统负责捕捉人体的身体动作,Manus数据手套专门精确捕捉手指动作。Xsens动捕套装上有接口或无线连接模块,可与Manus手套配对和传输数据,将身体与手指跟踪数据结合。 Face…

【Java开发日记】简单说一说使用 Netty 进行 Socket 编程

目录 什么是 Netty 对比Netty和传统的Socket 传统Socket编程服务端 传统Socket编程客户端 Netty环境搭建 先创建出来一个项目 Netty服务端程序 Netty客户端程序 Channel Channel分类 为什么选择Netty 什么是 Netty Netty是由JBOSS提供的一个java开源框架&#xff0c…

目标检测任务的评估指标mAP50和mAP50-95

mAP50 和 mAP50-95 是目标检测任务中常用的评估指标,用于衡量模型在不同 交并比(IoU)阈值 下的平均精度(Average Precision, AP)。它们的区别主要体现在 IoU 阈值范围 上。 ✅ 1. mAP50(mean Average Prec…

COHERENT XPRV23光电接收器控制软件

COHERENT XPRV23光电接收器控制软件

执行应用共享内存空间 同步QT进行快速捕获数据流

引言:本文章针对驱动的应用app,例如sensor data内容的获取,显示到QT的一种办法,共享内存。举例子,这是一个常见需求,比如摄像头采集进程与 GUI 显示进程分离,通过共享内存传输图像,避…

opencl的简单介绍以及c++实例

🧩 一、什么是 OpenCL? OpenCL(Open Computing Language) 是一个用于异构计算的开放标准,由 Khronos Group 提出和维护。它允许你在各种计算设备上(如 CPU、GPU、DSP、FPGA)并行运行代码&#…

ThingsCloud事物云平台搭建-微信小程序

ThingsCloud云平台与微信小程序设计 本文主要是介绍ThingsCloud云平台的搭建及微信小程序与app的使用。 当前文章是作为一个通用案例,介绍如何快速使用 ThingsCloud云平台 以及 利用 ThingsCloud云平台平台的框架快速设计手机APP和微信小程序。 可以快速让硬件接入,实现硬件…

2024 一带一路暨金砖国家职业技能大赛(金砖国家未来技能和技术挑战赛)

2024 一带一路暨金砖国家职业技能大赛(金砖国家未来技能和技术挑战赛任务书) 1 参加比赛的形式:2 项目阶段简介:3 项目阶段和所需时间:4 第一阶段:职业素养与理论技能4.1 项目 1.职业素养4.2 项目 2.法律法…