[DISCUSSION] Workload splitting through Hazelcast
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bastante claro
- Estado de actividad
- Activo
- Stack tecnológico
- java, spring, spring-boot
- Área
- backend, distributed-systems
Línea de trabajo
Start by reviewing the proposed HazelcastPartitionFilter and the adaptations to CloudDiscoveryService, the triggers, InstanceRegistry, and InstanceDiscoveryListener in the issue. Check how these components currently handle discovery and events, then assess whether the proposal covers all relevant code paths and preserves expected behavior across nodes. Done means reaching agreement on an approach before any large implementation PR.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Hello guys.
Recently I've been thinking to ways to make the current (half) clustering work fully so that jobs (e.g. StatusUpdateTrigger, InfoUpdateTrigger, NotificationTrigger and so on) are executed only on one one node while the whole state is anyway kept in sync with Hazelcast-specific collections.
I've therefore been working a bit with AI on this and this was a suggestion I got from it which, when I see it, code quality aside, it kind of makes sense to me:
@Component
public static class HazelcastPartitionFilter {
private final HazelcastInstance hazelcastInstance;
public HazelcastPartitionFilter(HazelcastInstance hazelcastInstance) {
this.hazelcastInstance = hazelcastInstance;
}
public boolean isMyPartition(InstanceId instanceId) {
if (instanceId == null || instanceId.getValue() == null) {
return false;
}
var partitionService = hazelcastInstance.getPartitionService();
Partition partition = partitionService.getPartition(instanceId.getValue());
return partition.getOwner() != null && partition.getOwner().localMember();
}
}
public static class HazelcastShardedDiscoveryService extends CloudDiscoveryService {
private final DiscoveryClient discoveryClient;
private final HazelcastPartitionFilter partitionFilter;
public HazelcastShardedDiscoveryService(DiscoveryClient discoveryClient,
HazelcastPartitionFilter partitionFilter) {
super(discoveryClient);
this.discoveryClient = discoveryClient;
this.partitionFilter = partitionFilter;
}
@Override
public Flux<Registration> convertToRegistrations(String serviceId) {
return Flux.fromIterable(discoveryClient.getInstances(serviceId))
.map(instance -> this.convertToRegistration(serviceId, instance))
.filter(reg -> partitionFilter.isMyPartition(reg.getInstanceId()));
}
}
@Bean
@Primary
public CloudDiscoveryService cloudDiscoveryService(DiscoveryClient discoveryClient,
HazelcastPartitionFilter partitionFilter) {
return new HazelcastShardedDiscoveryService(discoveryClient, partitionFilter);
}
@Bean
@Primary
public StatusUpdateTrigger statusUpdateTrigger(StatusUpdater statusUpdater, HazelcastPartitionFilter partitionFilter) {
return new StatusUpdateTrigger(statusUpdater) {
@Override
protected Publisher<Void> handle(InstanceEvent event) {
if (partitionFilter.isMyPartition(event.getInstance())) {
return super.handle(event);
}
return Mono.empty();
}
};
}
@Bean
@Primary
public InfoUpdateTrigger infoUpdateTrigger(InfoUpdater infoUpdater, HazelcastPartitionFilter partitionFilter) {
return new InfoUpdateTrigger(infoUpdater) {
@Override
protected Publisher<Void> handle(InstanceEvent event) {
if (partitionFilter.isMyPartition(event.getInstance())) {
return super.handle(event);
}
return Mono.empty();
}
};
}
@Bean
@Primary
public EndpointDetectionTrigger endpointDetectionTrigger(EndpointDetector endpointDetector, HazelcastPartitionFilter partitionFilter) {
return new EndpointDetectionTrigger(endpointDetector) {
@Override
protected Publisher<Void> handle(InstanceEvent event) {
if (partitionFilter.isMyPartition(event.getInstance())) {
return super.handle(event);
}
return Mono.empty();
}
};
}
@Bean
@Primary
public NotificationTrigger notificationTrigger(Notifier notifier,
InstanceRepository repository,
HazelcastPartitionFilter partitionFilter) {
return new NotificationTrigger(notifier, repository) {
@Override
protected Publisher<Void> handle(InstanceEvent event) {
if (partitionFilter.isMyPartition(event.getInstance())) {
return super.handle(event);
}
return Mono.empty();
}
};
}
@Bean
@Primary
public InstanceRegistry instanceRegistry(InstanceRepository repository,
InstanceIdGenerator idGenerator,
HazelcastPartitionFilter partitionFilter) {
return new InstanceRegistry(repository, idGenerator) {
@Override
public Mono<InstanceId> register(Registration registration) {
if (partitionFilter.isMyPartition(idGenerator.generateId(registration))) {
return super.register(registration);
}
return Mono.empty();
}
};
}
@Bean
@Primary
public InstanceDiscoveryListener instanceDiscoveryListener(CloudDiscoveryService discoveryService,
InstanceRegistry registry,
InstanceRepository repository) {
return new InstanceDiscoveryListener(discoveryService, registry, repository) {
@Override
public void discover() {
// Force the sync
super.discover();
}
};
}
I wanted to open this ticket to discuss with you the solution above and, in particular:
- if there any other code paths which I'm not aware of and that would require a similar adaptation
- if you think the solution above makes sense and it could actually work
- if you're willing to accept a PR with a polished version of the above (I can already anticipate it will be big)
- Lenguaje dominante
- Java
- Estrellas
- 12.9k
- Forks
- 3.2k
- Merge medio
- 23 h 31 min
- PR fusionados (30 d)
- 72
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de codecentric/spring-boot-admin
-
Bug: Dependency Trees overflows the call stack on cyclic SBOM dependency graphsPosiblemente ocupada @faystmax la tomó hace 5 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 68/100
codecentric/spring-boot-admin#5746 ·
Los mantenedores suelen responder en 1 día
-
Bug: Dependency Trees uses dependencies[0] as root instead of metadata.component.bom-refPosiblemente ocupada @faystmax la tomó hace 5 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 68/100
codecentric/spring-boot-admin#5745 ·
Los mantenedores suelen responder en 1 día
-
Bug: Filtering rules are not synchronized between SBA nodesPosiblemente ocupada @SteKoe la tomó hace 7 días. Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 45/100
codecentric/spring-boot-admin#5721 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Bug: Multiple notifications from multiple instancesPosiblemente ocupada @YadavKshitiz la tomó hace 9 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 55/100
codecentric/spring-boot-admin#5716 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 52/100
codecentric/spring-boot-admin#5597 · 6 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de codecentric/spring-boot-admin
Issues similares
-
backend
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
bcgov/nr-forest-client#2524 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 74/100
Los mantenedores suelen responder en 1 día
-
team:Lumberjack
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
OpenLiberty/open-liberty#35998 ·
Los mantenedores suelen responder en 1 día
-
[BUG] SQS SendMessageBatch accepts more than 10 entries instead of TooManyEntriesInBatchRequestPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
floci-io/floci#5319 · 1 comentario ·
Los mantenedores suelen responder en 1 día