topic 限流

This commit is contained in:
许晓东
2021-11-27 19:46:06 +08:00
parent 4639335a9d
commit 34c87997d1
9 changed files with 263 additions and 8 deletions

View File

@@ -0,0 +1,21 @@
package com.xuxd.kafka.console.beans.dto;
import com.xuxd.kafka.console.beans.enums.TopicThrottleSwitch;
import java.util.List;
import lombok.Data;
/**
* kafka-console-ui.
*
* @author xuxd
* @date 2021-11-26 15:33:37
**/
@Data
public class TopicThrottleDTO {
private String topic;
private List<Integer> partitions;
private TopicThrottleSwitch operation;
}

View File

@@ -0,0 +1,11 @@
package com.xuxd.kafka.console.beans.enums;
/**
* kafka-console-ui.
*
* @author xuxd
* @date 2021-11-26 15:33:07
**/
public enum TopicThrottleSwitch {
ON,OFF;
}

View File

@@ -3,6 +3,7 @@ package com.xuxd.kafka.console.controller;
import com.xuxd.kafka.console.beans.ReplicaAssignment;
import com.xuxd.kafka.console.beans.dto.AddPartitionDTO;
import com.xuxd.kafka.console.beans.dto.NewTopicDTO;
import com.xuxd.kafka.console.beans.dto.TopicThrottleDTO;
import com.xuxd.kafka.console.beans.enums.TopicType;
import com.xuxd.kafka.console.service.TopicService;
import java.util.ArrayList;
@@ -82,4 +83,9 @@ public class TopicController {
public Object updateReplicaAssignment(@RequestBody ReplicaAssignment assignment) {
return topicService.updateReplicaAssignment(assignment);
}
@PostMapping("/replica/throttle")
public Object configThrottle(@RequestBody TopicThrottleDTO dto) {
return topicService.configThrottle(dto.getTopic(), dto.getPartitions(), dto.getOperation());
}
}

View File

@@ -2,6 +2,7 @@ package com.xuxd.kafka.console.service;
import com.xuxd.kafka.console.beans.ReplicaAssignment;
import com.xuxd.kafka.console.beans.ResponseData;
import com.xuxd.kafka.console.beans.enums.TopicThrottleSwitch;
import com.xuxd.kafka.console.beans.enums.TopicType;
import java.util.List;
import java.util.Map;
@@ -31,4 +32,6 @@ public interface TopicService {
ResponseData getCurrentReplicaAssignment(String topic);
ResponseData updateReplicaAssignment(ReplicaAssignment assignment);
ResponseData configThrottle(String topic, List<Integer> partitions, TopicThrottleSwitch throttleSwitch);
}

View File

@@ -3,6 +3,7 @@ package com.xuxd.kafka.console.service.impl;
import com.google.gson.Gson;
import com.xuxd.kafka.console.beans.ReplicaAssignment;
import com.xuxd.kafka.console.beans.ResponseData;
import com.xuxd.kafka.console.beans.enums.TopicThrottleSwitch;
import com.xuxd.kafka.console.beans.enums.TopicType;
import com.xuxd.kafka.console.beans.vo.TopicDescriptionVO;
import com.xuxd.kafka.console.beans.vo.TopicPartitionVO;
@@ -148,4 +149,19 @@ public class TopicServiceImpl implements TopicService {
boolean success = (boolean) tuple2._1();
return success ? ResponseData.create().success() : ResponseData.create().failed(tuple2._2());
}
@Override public ResponseData configThrottle(String topic, List<Integer> partitions, TopicThrottleSwitch throttleSwitch) {
Tuple2<Object, String> tuple2 = null;
switch (throttleSwitch) {
case ON:
tuple2 = topicConsole.configThrottle(topic, partitions);
break;
case OFF:
break;
default:
throw new IllegalArgumentException("switch is unknown.");
}
boolean success = (boolean) tuple2._1();
return success ? ResponseData.create().success() : ResponseData.create().failed(tuple2._2());
}
}

View File

@@ -172,7 +172,7 @@ class TopicConsole(config: KafkaConfig) extends KafkaConsole(config: KafkaConfig
if (interBrokerThrottle >= 0) {
val moveMap = calculateProposedMoveMap(currentReassignments, proposedParts, currentParts)
modifyReassignmentThrottle(adminClient, moveMap, interBrokerThrottle)
modifyReassignmentThrottle(adminClient, moveMap)
}
if (logDirThrottle >= 0) {
@@ -195,6 +195,35 @@ class TopicConsole(config: KafkaConfig) extends KafkaConsole(config: KafkaConfig
}
}
def configThrottle(topic: String, partitions: util.List[Integer]): (Boolean, String) = {
withAdminClientAndCatchError(admin => {
val throttles = {
if (partitions.get(0) == -1) {
Map(topic -> "*")
} else {
val topicDescription = admin.describeTopics(Collections.singleton(topic), withTimeoutMs(new DescribeTopicsOptions))
.all().get().values().asScala.toList
def convert(partition: Integer, replicas: scala.List[Int]): String = {
replicas.map("%d:%d".format(partition, _)).toSet.mkString(",")
}
val ptor = topicDescription.head.partitions().asScala.map(info => (info.partition(), info.replicas().asScala.map(_.id()))).toMap
val conf = partitions.asScala.map(partition => convert(partition, ptor.get(partition) match {
case Some(v) => v.toList
case None => throw new IllegalArgumentException
})).toList
Map(topic -> conf.mkString(","))
}
}
modifyTopicThrottles(admin, throttles, throttles)
(true, "")
}, e => {
log.error("configThrottle error, ", e)
(false, e.getMessage)
}).asInstanceOf[(Boolean, String)]
}
/**
* Get the current replica assignments for some topics.
*
@@ -242,12 +271,9 @@ class TopicConsole(config: KafkaConfig) extends KafkaConsole(config: KafkaConfig
}
}
private def modifyReassignmentThrottle(admin: Admin, moveMap: MoveMap, interBrokerThrottle: Long): Unit = {
private def modifyReassignmentThrottle(admin: Admin, moveMap: MoveMap): Unit = {
val leaderThrottles = calculateLeaderThrottles(moveMap)
val followerThrottles = calculateFollowerThrottles(moveMap)
modifyTopicThrottles(admin, leaderThrottles, followerThrottles)
// val reassigningBrokers = calculateReassigningBrokers(moveMap)
// modifyInterBrokerThrottle(admin, reassigningBrokers, interBrokerThrottle)
}
}