返回顶部
首页 > 资讯 > 精选 >Java中如何实现Kafka消费积压监控
  • 207
分享到

Java中如何实现Kafka消费积压监控

2023-06-20 12:06:13 207人浏览 泡泡鱼
摘要

小编给大家分享一下Java中如何实现kafka消费积压监控,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!后端代码:Monitor.java代码:package&n

小编给大家分享一下Java中如何实现kafka消费积压监控,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

后端代码:

Monitor.java代码:

package com.suncreate.kafkaConsumerMonitor.service;import com.suncreate.kafkaConsumerMonitor.model.ConsumerInfo;import org.apache.kafka.clients.consumer.ConsumerConfig;import org.apache.kafka.clients.consumer.KafkaConsumer;import org.apache.kafka.clients.consumer.OffsetAndMetadata;import org.apache.kafka.common.PartitionInfo;import org.apache.kafka.common.TopicPartition;import org.apache.kafka.common.serialization.StringDeserializer;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.text.DecimalFORMat;import java.text.SimpleDateFormat;import java.util.*;public class Monitor {    private static final Logger log = LoggerFactory.getLogger(Monitor.class);    private String servers;    private String topic;    private String groupId;    private long lastTime;    private long lastTotalLag = 0L;    private long lastLogSize = 0L;    private long lastOffset = 0L;    private double lastRatio = 0;    private long speedLogSize = 0L;    private long speedOffset = 0L;    private String time;    private List<ConsumerInfo> list;    private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    public String getTime() {        return time;    }    public void setTime(String time) {        this.time = time;    }    public long getLastTotalLag() {        return lastTotalLag;    }    public double getLastRatio() {        return lastRatio;    }    public String getTopic() {        return topic;    }    public String getGroupId() {        return groupId;    }    public long getSpeedLogSize() {        return speedLogSize;    }    public long getSpeedOffset() {        return speedOffset;    }    public List<ConsumerInfo> getList() {        return list;    }    public void setList(List<ConsumerInfo> list) {        this.list = list;    }    private KafkaConsumer<String, String> consumer;    private List<TopicPartition> topicPartitionList;    private final DecimalFormat decimalFormat = new DecimalFormat("0.00");    public Monitor(String servers, String topic, String groupId) {        this.servers = servers;        this.topic = topic;        this.groupId = groupId;        this.list = new ArrayList<>();        //消费者        Properties properties = new Properties();        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, this.servers);        properties.put(ConsumerConfig.GROUP_ID_CONFIG, this.groupId);        properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);        properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);        consumer = new KafkaConsumer<String, String>(properties);        //查询 topic partitions        topicPartitionList = new ArrayList<>();        List<PartitionInfo> partitionInfoList = consumer.partitionsFor(topic);        for (PartitionInfo partitionInfo : partitionInfoList) {            TopicPartition topicPartition = new TopicPartition(partitionInfo.topic(), partitionInfo.partition());            topicPartitionList.add(topicPartition);        }    }    public void monitor(boolean addToList) {        try {            long startTime = System.currentTimeMillis();            //查询 log size            Map<Integer, Long> endOffsetMap = new HashMap<>();            Map<TopicPartition, Long> endOffsets = consumer.endOffsets(topicPartitionList);            for (TopicPartition partitionInfo : endOffsets.keySet()) {                endOffsetMap.put(partitionInfo.partition(), endOffsets.get(partitionInfo));            }            //查询消费 offset            Map<Integer, Long> commitOffsetMap = new HashMap<>();            for (TopicPartition topicAndPartition : topicPartitionList) {                OffsetAndMetadata committed = consumer.committed(topicAndPartition);                commitOffsetMap.put(topicAndPartition.partition(), committed.offset());            }            long endTime = System.currentTimeMillis();            log.info("查询logSize和offset耗时:" + (new DecimalFormat("0.000")).format((endTime - startTime) / 1000.0) + " 秒");            startTime = System.currentTimeMillis();            //累加lag            long totalLag = 0L;            long logSize = 0L;            long offset = 0L;            if (endOffsetMap.size() == commitOffsetMap.size()) {                for (Integer partition : endOffsetMap.keySet()) {                    long endOffset = endOffsetMap.get(partition);                    long commitOffset = commitOffsetMap.get(partition);                    long diffOffset = endOffset - commitOffset;                    totalLag += diffOffset;                    logSize += endOffset;                    offset += commitOffset;                }            } else {                log.error("Topic:" + topic + "  consumer:" + consumer + "  topic partitions lost");            }            log.info("Topic:" + topic + "  logSize:" + logSize + "  offset:" + offset + "  totalLag:" + totalLag);            if (lastTime > 0) {                if (System.currentTimeMillis() - lastTime > 0) {                    speedLogSize = (long) ((logSize - lastLogSize) / ((System.currentTimeMillis() - lastTime) / 1000.0));                    speedOffset = (long) ((offset - lastOffset) / ((System.currentTimeMillis() - lastTime) / 1000.0));                }                if (speedLogSize > 0) {                    String strRatio = decimalFormat.format(speedOffset * 100 / (speedLogSize * 1.0));                    lastRatio = Double.parseDouble(strRatio);                    log.info("Topic:" + topic + "  speedLogSize:" + speedLogSize + "  speedOffset:" + speedOffset + "  百分比:" + strRatio + "%");                }            }            lastTime = System.currentTimeMillis();            lastTotalLag = totalLag;            lastLogSize = logSize;            lastOffset = offset;            endTime = System.currentTimeMillis();            log.info("计算耗时:" + (new DecimalFormat("0.000")).format((endTime - startTime) / 1000.0) + " 秒");            if (addToList) {                this.setTime(simpleDateFormat.format(new Date()));                this.list.add(new ConsumerInfo(this.getTopic(), this.getGroupId(), this.getLastTotalLag(), this.getLastRatio(), this.getSpeedLogSize(), this.getSpeedOffset(), this.getTime()));                if (this.list.size() > 500) {                    this.list.remove(0);                }            }        } catch (Exception e) {            log.error("Monitor error", e);        }    }}

MonitorService.java代码:

package com.suncreate.kafkaConsumerMonitor.service;import com.suncreate.kafkaConsumerMonitor.model.ConsumerInfo;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;import java.util.*;@Servicepublic class MonitorService {    private static final Logger log = LoggerFactory.getLogger(MonitorService.class);    @Value("${kafka.consumer.servers}")    private String servers;    private Monitor monitor;    private List<Monitor> monitorList;    @PostConstruct    private void Init() {        monitorList = new ArrayList<>();        monitorList.add(new Monitor(servers, "wifiData", "wifi-kafka-HBase"));        monitorList.add(new Monitor(servers, "KK_PASS_INFO_TYCC", "EXTRACT-SAMPLE"));        monitorList.add(new Monitor(servers, "KK_PASS_INFO_TYCC", "dblrecog-upload2vcn"));        monitorList.add(new Monitor(servers, "KK_PASS_INFO_TYCC_FILTER", "yisa20210521000001"));        monitorList.add(new Monitor(servers, "KK_PASS_INFO_TYCC_FILTER", "kafka-filter-check-19"));        monitorList.add(new Monitor(servers, "motorVehicle", "unifiedstorage-downloader"));        monitorList.add(new Monitor(servers, "motorVehicle", "full-vehicle-data-storage-kafka2ch"));        monitorList.add(new Monitor(servers, "motorVehicle", "vehicle_store"));        monitorList.add(new Monitor(servers, "motorVehicle", "vcn-sk-upload-luyang"));        monitorList.add(new Monitor(servers, "motorVehicle", "vcn-sk-upload-yaohai"));        monitorList.add(new Monitor(servers, "motorVehicle", "vcn-sk-upload-baohe"));        monitorList.add(new Monitor(servers, "peopleFace", "kafka-filter-check-19"));    }    public void monitorOnce(boolean addToList) {        for (Monitor monitor : monitorList) {            monitor.monitor(addToList);        }    }    public List<ConsumerInfo> getConsumerList() {        List<ConsumerInfo> list = new ArrayList<>();        for (Monitor monitor : monitorList) {            list.add(new ConsumerInfo(monitor.getTopic(), monitor.getGroupId(), monitor.getLastTotalLag(), monitor.getLastRatio(), monitor.getSpeedLogSize(), monitor.getSpeedOffset(), monitor.getTime()));        }        return list;    }    public List<ConsumerInfo> getDetails(String topic, String groupId) {        for (Monitor monitor : monitorList) {            if (monitor.getTopic().equals(topic) && monitor.getGroupId().equals(groupId)) {                return monitor.getList();            }        }        return new ArrayList<>();    }}

MonitorConfig.java代码:

package com.suncreate.kafkaConsumerMonitor.task;import com.suncreate.kafkaConsumerMonitor.service.MonitorService;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.SchedulinGConfigurer;import org.springframework.scheduling.config.ScheduledTaskReGIStrar;import org.springframework.scheduling.support.CronTrigger;import java.text.SimpleDateFormat;@Configuration@EnableSchedulingpublic class MonitorConfig implements SchedulingConfigurer {    private static final Logger logger = LoggerFactory.getLogger(MonitorConfig.class);    private String cronExpression = "0 */3 * * * ?";    //private String cronExpression = "*/20 * * * * ?";    private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");    @Autowired    private MonitorService monitorService;    @Override    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {        taskRegistrar.addTriggerTask(() -> {            monitorService.monitorOnce(true);        }, triggerContext -> new CronTrigger(cronExpression).nextExecutionTime(triggerContext));    }}

MonitorController.java代码:

package com.suncreate.kafkaConsumerMonitor.controller;import com.suncreate.kafkaConsumerMonitor.model.ConsumerInfo;import com.suncreate.kafkaConsumerMonitor.model.LayuiData;import com.suncreate.kafkaConsumerMonitor.service.MonitorService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.WEB.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController@RequestMapping("/monitor")public class MonitorController {    @Autowired    private MonitorService monitorService;    @GetMapping("/getConsumers")    public LayuiData getConsumers() {        List<ConsumerInfo> list = monitorService.getConsumerList();        LayuiData data = new LayuiData(list);        return data;    }    @GetMapping("/monitorOnce")    public void monitorOnce() {        monitorService.monitorOnce(false);    }    @GetMapping("/getDetails")    public LayuiData getDetails(String topic, String groupId) {        List<ConsumerInfo> list = monitorService.getDetails(topic, groupId);        LayuiData data = new LayuiData(list);        return data;    }}

pom.xml文件(有些东西没用到或者备用,没有删):

<?xml version="1.0" encoding="UTF-8"?><project xmlns="Http://Maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.1.6.RELEASE</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <groupId>com.suncreate</groupId>    <artifactId>kafka-consumer-monitor</artifactId>    <version>1.0</version>    <name>kafka-consumer-monitor</name>    <description>Kafka消费积压监控预警</description>    <properties>        <java.version>1.8</java.version>        <elasticsearch.version>6.1.4</elasticsearch.version>    </properties>    <dependencies>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <version>1.18.12</version>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>fastJSON</artifactId>            <version>1.2.54</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>        <dependency>            <groupId>org.springframework.kafka</groupId>            <artifactId>spring-kafka-test</artifactId>            <scope>test</scope>        </dependency>        <dependency>            <groupId>com.Google.code.gson</groupId>            <artifactId>gson</artifactId>            <version>2.8.0</version>        </dependency>        <dependency>            <groupId>org.postgresql</groupId>            <artifactId>postgresql</artifactId>            <scope>runtime</scope>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-jdbc</artifactId>        </dependency>        <dependency>            <groupId>org.elasticsearch.client</groupId>            <artifactId>elasticsearch-rest-high-level-client</artifactId>            <version>6.1.4</version>        </dependency>        <dependency>            <groupId>com.oracle</groupId>            <artifactId>ojdbc6</artifactId>            <version>11.1.0.7.0</version>        </dependency>        <dependency>            <groupId>org.apache.kafka</groupId>            <artifactId>kafka_2.11</artifactId>            <version>0.11.0.1</version>        </dependency>        <dependency>            <groupId>org.apache.kafka</groupId>            <artifactId>kafka-clients</artifactId>            <version>0.11.0.1</version>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-compiler-plugin</artifactId>                <configuration>                    <source>8</source>                    <target>8</target>                </configuration>            </plugin>        </plugins>    </build></project>

前端使用了 Layui 和 ECharts 展示表格和图表

index.CSS代码:

.div-title {    font-size: 18px;    margin-top: 10px;    margin-left: 10px;}.div-right {    text-align: right;}.span-red {    color: #ff0000;}

index.html代码(展示topic、消费者组Consumer GroupId、Total Lag、Kafka数据生产速度、Kafka数据消费速度等):

<!DOCTYPE html><html lang="zh"><head>    <meta charset="UTF-8">    <title>Title</title>    <link rel="stylesheet" href="css/index.css" rel="external nofollow"  rel="external nofollow" >    <link rel="stylesheet" href="js/layui-v2.6.8/css/layui.css" rel="external nofollow"  rel="external nofollow"  media="all">    <script type="text/javascript" src="js/Jquery-1.7.1.js"></script>    <script type="text/javascript" src="js/layui-v2.6.8/layui.js" charset="utf-8"></script></head><body><div class="div-title">Kafka 监控    <button type="button" class="layui-btn layui-btn-sm" onclick="refreshTable()">刷新</button></div><table class="layui-hide" id="myTable"></table><script type="text/javascript">    var myTable;    layui.use('table', function () {        var table = layui.table;        myTable = table.render({            elem: '#myTable',            url: '/home/monitor/getConsumers',            cellMinWidth: 80, //全局定义常规单元格的最小宽度            cols: [[                {field: 'topic', width: 300, title: 'topic', sort: true},                {field: 'groupId', width: 300, title: 'groupId'},                {                    field: 'totalLag', width: 150, title: 'Total Lag', sort: true, templet: function (d) {                        if (d.delayDay * 24 > 2) {                            return '<div class="div-right"><span class="span-red">' + d.totalLag + '</span></div>'                        } else {                            return '<div class="div-right"><span>' + d.totalLag + '</span></div>'                        }                    }                },                {                    field: 'speedLogSize', width: 150, title: '生产速度(条/秒)', templet: function (d) {                        return '<div class="div-right">' + d.speedLogSize + '</div>'                    }                },                {                    field: 'speedOffset', width: 150, title: '消费速度(条/秒)', templet: function (d) {                        return '<div class="div-right">' + d.speedOffset + '</div>'                    }                },                {                    field: 'ratio', width: 100, title: '消费/生产', templet: function (d) {                        if (d.ratio < 90) {                            return '<div class="div-right"><span class="span-red">' + d.ratio + '%</span></div>'                        } else {                            return '<div class="div-right"><span>' + d.ratio + '%</span></div>'                        }                    }                },                {                    field: 'delayDay', width: 150, title: '积压(天)', sort: true, templet: function (d) {                        if (d.delayDay * 24 > 2) {                            return '<div class="div-right"><span class="span-red">' + d.delayDay + '</span></div>'                        } else {                            return '<div class="div-right"><span>' + d.delayDay + '</span></div>'                        }                    }                },                {                    field: 'ope', width: 100, title: '操作', templet: function (d) {                        return '<a href="/home/detail.html?topic=' + d.topic + '&groupId=' + d.groupId + '" rel="external nofollow"  target="_blank" class="layui-btn layui-btn-sm" >详细</a>';                    }                }            ]]        });    });    function refreshTable() {        if (myTable) {            myTable.reload();        }    }    setInterval(function () {        refreshTable();    }, 30000);    // setInterval(function () {    //     $.get("/home/monitor/monitorOnce");    // }, 30000);</script></body></html>

detail.html代码(展示单个消费者组的Total Lag、生产速度、消费速度以及Total Lag趋势图):

<!DOCTYPE html><html lang="zh"><head>    <meta charset="UTF-8">    <title>Title</title>    <link rel="stylesheet" href="css/index.css" rel="external nofollow"  rel="external nofollow" >    <link rel="stylesheet" href="js/layui-v2.6.8/css/layui.css" rel="external nofollow"  rel="external nofollow"  media="all">    <script type="text/javascript" src="js/jquery-1.7.1.js"></script>    <script type="text/javascript" src="js/layui-v2.6.8/layui.js" charset="utf-8"></script>    <script type="text/javascript" src="js/echarts-v4.7.0/echarts.min.js"></script></head><body><div class="div-title"><span id="detailTitle"></span> 明细    <button type="button" class="layui-btn layui-btn-sm" onclick="refreshTable()">刷新</button></div><div id="main" ></div><table class="layui-hide" id="test"></table><script type="text/javascript">    var myTable;    var topic = getQueryVariable("topic");    var groupId = getQueryVariable("groupId");    $("#detailTitle").html(topic + "  " + groupId);    layui.use('table', function () {        var table = layui.table;        myTable = table.render({            elem: '#test',            url: '/home/monitor/getDetails?topic=' + topic + '&groupId=' + groupId,            cellMinWidth: 80, //全局定义常规单元格的最小宽度            initSort: {                field: 'time', //排序字段,对应 cols 设定的各字段名                type: 'desc' //排序方式  asc: 升序、desc: 降序、null: 默认排序            },            cols: [[                {field: 'topic', width: 300, title: 'topic'},                {field: 'groupId', width: 300, title: 'groupId'},                {field: 'time', width: 180, title: '时间', sort: true},                {                    field: 'totalLag', width: 150, title: 'Total Lag', templet: function (d) {                        if (d.delayDay * 24 > 2) {                            return '<div class="div-right"><span class="span-red">' + d.totalLag + '</span></div>'                        } else {                            return '<div class="div-right"><span>' + d.totalLag + '</span></div>'                        }                    }                },                {                    field: 'speedLogSize', width: 150, title: '生产速度(条/秒)', templet: function (d) {                        return '<div class="div-right">' + d.speedLogSize + '</div>'                    }                },                {                    field: 'speedOffset', width: 150, title: '消费速度(条/秒)', templet: function (d) {                        return '<div class="div-right">' + d.speedOffset + '</div>'                    }                },                {                    field: 'ratio', width: 100, title: '消费/生产', templet: function (d) {                        if (d.ratio < 90) {                            return '<div class="div-right"><span class="span-red">' + d.ratio + '%</span></div>'                        } else {                            return '<div class="div-right"><span>' + d.ratio + '%</span></div>'                        }                    }                },                {                    field: 'delayDay', width: 150, title: '积压(天)', templet: function (d) {                        if (d.delayDay * 24 > 2) {                            return '<div class="div-right"><span class="span-red">' + d.delayDay + '</span></div>'                        } else {                            return '<div class="div-right"><span>' + d.delayDay + '</span></div>'                        }                    }                }            ]]        });    });    function refreshTable() {        if (myTable) {            myTable.reload();        }        showChart();    }    setInterval(function () {        refreshTable();    }, 30000);    function getQueryVariable(variable) {        var query = window.location.search.substring(1);        var vars = query.split("&");        for (var i = 0; i < vars.length; i++) {            var pair = vars[i].split("=");            if (pair[0] == variable) {                return pair[1];            }        }        return (false);    }    function showChart() {        $.ajax({            type: "GET",            url: '/home/monitor/getDetails?topic=' + topic + '&groupId=' + groupId,            success: function (data) {                if (data && data.data && data.data.length > 1) {                    debugger;                    var chartDom = document.getElementById('main');                    var myChart = echarts.init(chartDom);                    var option;                    var xAxis = [];                    var serseis = [];                    for (var i = 0; i < data.data.length; i++) {                        xAxis.push(data.data[i].time);                        serseis.push(data.data[i].totalLag);                    }                    option = {                        title: {                            show: true,                            text: "Total Lag 趋势图",                            x: 'center'                        },                        xAxis: {                            type: 'category',                            data: xAxis                        },                        yAxis: {                            type: 'value'                        },                        series: [{                            data: serseis,                            type: 'line'                        }]                    };                    myChart.setOption(option);                }            }        });    }    showChart();</script></body></html>

效果图:

消费者组列表:

Java中如何实现Kafka消费积压监控

消费者组明细:

Java中如何实现Kafka消费积压监控

以上是“Java中如何实现Kafka消费积压监控”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Java中如何实现Kafka消费积压监控

本文链接: https://lsjlt.com/news/296788.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中如何实现Kafka消费积压监控
    小编给大家分享一下Java中如何实现Kafka消费积压监控,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!后端代码:Monitor.java代码:package&n...
    99+
    2023-06-20
  • Java Kafka 消费积压监控的示例代码
    后端代码: Monitor.java代码: package com.suncreate.kafkaConsumerMonitor.service; import com.sun...
    99+
    2024-04-02
  • maven如何实现kafka消息消费
    要使用 Maven 实现 Kafka 消息消费,需要按照以下步骤进行操作:1. 在 Maven 项目的 `pom.xml` 文件中添...
    99+
    2023-09-14
    maven kafka
  • 如何在spring中使用kafka对消费者进行监听
    这期内容当中小编将会给大家带来有关如何在spring中使用kafka对消费者进行监听,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。整合过程 引入spring-kafka的依赖包 <depe...
    99+
    2023-06-06
  • Kafka中的Consumer如何跟踪已经消费的消息
    Kafka中的Consumer通过offset来跟踪已经消费的消息。每个Consumer会维护一个offset,表示当前已经消费到的...
    99+
    2024-04-02
  • java中BlockingQueue如何实现生产者消费者
    这篇文章主要为大家展示了“java中BlockingQueue如何实现生产者消费者”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java中BlockingQueue如何实现生产者消费者”这篇文章...
    99+
    2023-05-30
    java blockingqueue
  • 如何在Prometheus中实现监控数据的压缩和存档
    在Prometheus中实现监控数据的压缩和存档可以通过以下步骤实现: 使用数据保留策略:在Prometheus配置文件中配置数...
    99+
    2024-03-04
    Prometheus
  • java如何实现接口流量监控
    要实现接口流量监控,可以使用Java的Network Interface和TrafficStats类。首先,可以使用Network ...
    99+
    2023-09-15
    java
  • Kafka中如何实现消息的事务性保证
    Kafka中可以通过以下几种方式实现消息的事务性保证: 使用生产者事务:Kafka提供了生产者事务API,可以确保消息的原子性提...
    99+
    2024-04-02
  • kafka消息不丢失是如何实现的
    Kafka通过以下几个方面来确保消息不丢失: 持久化存储:Kafka使用持久化日志文件来存储消息,即将消息写入到硬盘上的文件中。...
    99+
    2023-10-20
    kafka
  • Kafka中的消息复制机制是如何实现的
    Kafka中的消息复制机制是通过复制分区来实现的。在Kafka中,每个主题可以分为多个分区,每个分区可以有多个副本。当生产者发送消息...
    99+
    2024-04-02
  • springcloud中如何实现熔断监控Turbine
    小编给大家分享一下springcloud中如何实现熔断监控Turbine,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在复杂的分布式系统中,相同服务的节点经常需要...
    99+
    2023-06-05
  • Java如何实现消消乐中的消除功能
    这篇文章主要介绍Java如何实现消消乐中的消除功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下有n行m列矩阵,每个位置的元素取值(1~9),同一行或者同一列中如果有三个以及三个以上的数字相同时,将改相同...
    99+
    2023-06-20
  • java如何实现对kafka过滤
    在Java中,可以使用Kafka Consumer API来实现对Kafka消息的过滤。以下是一个简单的示例代码:```javaim...
    99+
    2023-09-14
    kafka java
  • springboot+rabbitmq如何实现指定消费者才能消费
    这篇文章将为大家详细讲解有关springboot+rabbitmq如何实现指定消费者才能消费,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。如何保证mq队列里的消息只被测试服务器上的consumer消费,避...
    99+
    2023-06-25
  • Kafka中如何处理消费者异常退出的情况
    Kafka中处理消费者异常退出的情况通常需要通过配置合适的参数和监控机制来解决。下面是一些常见的处理方法: 使用自动提交偏移量:...
    99+
    2024-04-02
  • Kafka中如何实现自定义的消息存储格式
    在Kafka中,可以通过实现自定义的序列化和反序列化器来实现自定义的消息存储格式。以下是实现自定义消息存储格式的一般步骤: 定义...
    99+
    2024-04-09
    Kafka
  • Java如何实现ZIP压缩与解压
    Java如何实现ZIP压缩与解压,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。程序实现了ZIP压缩。共分为2部分 : 压缩(compression)与解压(de...
    99+
    2023-06-17
  • Redis如何实现性能监控
    小编给大家分享一下Redis如何实现性能监控,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!redis_exporter + prometheus +grafana监控Redis服务指标1....
    99+
    2024-04-02
  • Linux如何实现性能监控
    小编给大家分享一下Linux如何实现性能监控,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! TOP命令显示的是一些Oracle session占用CPU...
    99+
    2023-06-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作