quarkusio / quarkus

Quarkus: Supersonic Subatomic Java.
https://quarkus.io
Apache License 2.0
13.7k stars 2.65k forks source link

Apicurio with Kafka ProtoBuf serde not working in native mode #22093

Closed hieunc278 closed 2 years ago

hieunc278 commented 2 years ago

Describe the bug

Currently, when we config to use ProtobufKafkaSerializer ( io.apicurio.registry.serde.protobuf.ProtobufKafkaSerializer ), it work normal in JVM Mode, but it has error when start in Native Mode

2021-12-09 07:13:14,661 ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): java.lang.ClassNotFoundException: io.apicurio.registry.serde.protobuf.ProtobufKafkaSerializer at com.oracle.svm.core.hub.ClassForNameSupport.forName(ClassForNameSupport.java:64) at java.lang.Class.forName(DynamicHub.java:1308) at org.apache.kafka.common.utils.Utils.loadClass(Utils.java:380) at org.apache.kafka.common.utils.Utils.newInstance(Utils.java:369) at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.createSerializer(ReactiveKafkaProducer.java:71) at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.(ReactiveKafkaProducer.java:58) at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.(ReactiveKafkaProducer.java:43) at io.smallrye.reactive.messaging.kafka.impl.KafkaSink.(KafkaSink.java:76) at io.smallrye.reactive.messaging.kafka.KafkaConnector.getSubscriberBuilder(KafkaConnector.java:227) at io.smallrye.reactive.messaging.kafka.KafkaConnector_ClientProxy.getSubscriberBuilder(KafkaConnector_ClientProxy.zig:368) at io.smallrye.reactive.messaging.impl.ConfiguredChannelFactory.createSubscriberBuilder(ConfiguredChannelFactory.java:207) at io.smallrye.reactive.messaging.impl.ConfiguredChannelFactory.register(ConfiguredChannelFactory.java:164) at io.smallrye.reactive.messaging.impl.ConfiguredChannelFactory.initialize(ConfiguredChannelFactory.java:125) at io.smallrye.reactive.messaging.impl.ConfiguredChannelFactory_ClientProxy.initialize(ConfiguredChannelFactory_ClientProxy.zig:189) at java.util.Iterator.forEachRemaining(Iterator.java:133) at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658) at io.smallrye.reactive.messaging.extension.MediatorManager.start(MediatorManager.java:189) at io.smallrye.reactive.messaging.extension.MediatorManager_ClientProxy.start(MediatorManager_ClientProxy.zig:220) at io.quarkus.smallrye.reactivemessaging.runtime.SmallRyeReactiveMessagingLifecycle.onApplicationStart(SmallRyeReactiveMessagingLifecycle.java:41) at io.quarkus.smallrye.reactivemessaging.runtime.SmallRyeReactiveMessagingLifecycle_Observer_onApplicationStart_4e8937813d9e8faff65c3c07f88fa96615b70e70.notify(SmallRyeReactiveMessagingLifecycle_Observer_onApplicationStart_4e8937813d9e8faff65c3c07f88fa96615b70e70.zig:111) at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:300) at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:282) at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:70) at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:128) at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:97) at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(LifecycleEventsBuildStep$startupEvent1144526294.zig:87) at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(LifecycleEventsBuildStep$startupEvent1144526294.zig:40) at io.quarkus.runner.ApplicationImpl.doStart(ApplicationImpl.zig:765) at io.quarkus.runtime.Application.start(Application.java:101) at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:101) at io.quarkus.runtime.Quarkus.run(Quarkus.java:66) at io.quarkus.runtime.Quarkus.run(Quarkus.java:42) at io.quarkus.runtime.Quarkus.run(Quarkus.java:119) at io.quarkus.runner.GeneratedMain.main(GeneratedMain.zig:29)

Our Pom file :

io.quarkus quarkus-grpc io.quarkus quarkus-hibernate-reactive io.quarkus quarkus-reactive-pg-client io.quarkus quarkus-smallrye-jwt io.quarkus quarkus-smallrye-jwt-build io.quarkus quarkus-arc com.fasterxml.jackson.core jackson-databind ${jackson.version} com.fasterxml.jackson.core jackson-core ${jackson.version} com.fasterxml.jackson.core jackson-annotations ${jackson.version} io.quarkus quarkus-container-image-jib io.quarkus quarkus-smallrye-reactive-messaging-kafka io.apicurio apicurio-registry-common ${apicurio.version} io.apicurio apicurio-registry-serdes-protobuf-serde ${apicurio.version} io.quarkus quarkus-resteasy-reactive io.quarkus quarkus-rest-client io.quarkus quarkus-junit5 test

Any helps are appreciate.

I saw that we have the similar issue before. but it seems it could not apply in this case.

https://github.com/quarkusio/quarkus/issues/13533

Expected behavior

Use ProtobufKafkaSerializer of Apicurio normally in Native mode

Actual behavior

No response

How to Reproduce?

No response

Output of uname -a or ver

No response

Output of java -version

No response

GraalVM version (if different from Java)

No response

Quarkus version or git rev

2.1.2-Final

Build tool (ie. output of mvnw --version or gradlew --version)

No response

Additional information

No response

quarkus-bot[bot] commented 2 years ago

/cc @cescoffier, @geoand, @ozangunalp

cescoffier commented 2 years ago

That's expected. We do not support Protobuf in native mode yet. Protobuf and json schema are on the backlog, but they were not addressed yet.

hieunc278 commented 2 years ago

Oh thank you so much for your quick response @cescoffier.

So as far as I understand, currently we could use Avro serdes in native mode. Is it correct ?

cescoffier commented 2 years ago

Yes, Avro works in native.

We will be adding the others, but I cannot give you an ETA.

hieunc278 commented 2 years ago

Dear @cescoffier,

Thank you again for your feedback. If so, we will use Avro first until ProtoBuf is supported in native mode as well.

And I will close it also.

anyway, does we could see that backlog item at GitHub also ?

cescoffier commented 2 years ago

Here it is: https://github.com/quarkusio/quarkus/issues/3041

hieunc278 commented 2 years ago

Dear @cescoffier,

Thanks for your information. I got it now.

Anyway, I also met another issue while trying to use Avro in Native mode, but I do not sure that it cause by Apicurio-registry or Quarkus as well.

Here is back-trace when I started with NoSuchElement exception as well 2021-12-11 05:22:43,931 ERROR [io.sma.rea.mes.provider] (main) SRMSG00230: Unable to create the publisher or subscriber during initialization: org.apache.kafka.common.KafkaException: java.lang.IllegalStateException: java.util.NoSuchElementException at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.configureSerializer(ReactiveKafkaProducer.java:89) at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.(ReactiveKafkaProducer.java:69) at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.(ReactiveKafkaProducer.java:45) at io.smallrye.reactive.messaging.kafka.impl.KafkaSink.(KafkaSink.java:76) at io.smallrye.reactive.messaging.kafka.KafkaConnector.getSubscriberBuilder(KafkaConnector.java:227) at io.smallrye.reactive.messaging.kafka.KafkaConnector_ClientProxy.getSubscriberBuilder(KafkaConnector_ClientProxy.zig:368) at io.smallrye.reactive.messaging.impl.ConfiguredChannelFactory.createSubscriberBuilder(ConfiguredChannelFactory.java:207) at io.smallrye.reactive.messaging.impl.ConfiguredChannelFactory.register(ConfiguredChannelFactory.java:164) at io.smallrye.reactive.messaging.impl.ConfiguredChannelFactory.initialize(ConfiguredChannelFactory.java:125) at io.smallrye.reactive.messaging.impl.ConfiguredChannelFactory_ClientProxy.initialize(ConfiguredChannelFactory_ClientProxy.zig:189) at java.util.Iterator.forEachRemaining(Iterator.java:133) at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658) at io.smallrye.reactive.messaging.extension.MediatorManager.start(MediatorManager.java:189) at io.smallrye.reactive.messaging.extension.MediatorManager_ClientProxy.start(MediatorManager_ClientProxy.zig:220) at io.quarkus.smallrye.reactivemessaging.runtime.SmallRyeReactiveMessagingLifecycle.onApplicationStart(SmallRyeReactiveMessagingLifecycle.java:41) at io.quarkus.smallrye.reactivemessaging.runtime.SmallRyeReactiveMessagingLifecycle_Observer_onApplicationStart_4e8937813d9e8faff65c3c07f88fa96615b70e70.notify(SmallRyeReactiveMessagingLifecycle_Observer_onApplicationStart_4e8937813d9e8faff65c3c07f88fa96615b70e70.zig:111) at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:300) at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:282) at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:70) at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:128) at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:97) at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(LifecycleEventsBuildStep$startupEvent1144526294.zig:87) at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(LifecycleEventsBuildStep$startupEvent1144526294.zig:40) at io.quarkus.runner.ApplicationImpl.doStart(ApplicationImpl.zig:765) at io.quarkus.runtime.Application.start(Application.java:101) at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:101) at io.quarkus.runtime.Quarkus.run(Quarkus.java:66) at io.quarkus.runtime.Quarkus.run(Quarkus.java:42) at io.quarkus.runtime.Quarkus.run(Quarkus.java:119) at io.quarkus.runner.GeneratedMain.main(GeneratedMain.zig:29) Caused by: java.lang.IllegalStateException: java.util.NoSuchElementException at io.apicurio.registry.serde.AbstractSchemaResolver.configure(AbstractSchemaResolver.java:92) at io.apicurio.registry.serde.DefaultSchemaResolver.configure(DefaultSchemaResolver.java:63) at io.apicurio.registry.serde.SchemaResolverConfigurer.configure(SchemaResolverConfigurer.java:78) at io.apicurio.registry.serde.AbstractKafkaSerDe.configure(AbstractKafkaSerDe.java:69) at io.apicurio.registry.serde.avro.AvroKafkaSerializer.configure(AvroKafkaSerializer.java:88) at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.configureSerializer(ReactiveKafkaProducer.java:87) ... 30 more Caused by: java.util.NoSuchElementException at java.util.ServiceLoader$2.next(ServiceLoader.java:1309) at java.util.ServiceLoader$2.next(ServiceLoader.java:1297) at java.util.ServiceLoader$3.next(ServiceLoader.java:1395) at io.apicurio.registry.rest.client.RegistryClientFactory.resolveProviderInstance(RegistryClientFactory.java:110) at io.apicurio.registry.rest.client.RegistryClientFactory.create(RegistryClientFactory.java:81) at io.apicurio.registry.rest.client.RegistryClientFactory.create(RegistryClientFactory.java:73) at io.apicurio.registry.serde.AbstractSchemaResolver.configure(AbstractSchemaResolver.java:87) ... 35 more

2021-12-11 05:22:43,944 ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): java.util.NoSuchElementException at java.util.ServiceLoader$2.next(ServiceLoader.java:1309) at java.util.ServiceLoader$2.next(ServiceLoader.java:1297) at java.util.ServiceLoader$3.next(ServiceLoader.java:1395) at io.apicurio.registry.rest.client.RegistryClientFactory.resolveProviderInstance(RegistryClientFactory.java:110) at io.apicurio.registry.rest.client.RegistryClientFactory.create(RegistryClientFactory.java:81) at io.apicurio.registry.rest.client.RegistryClientFactory.create(RegistryClientFactory.java:73) at io.apicurio.registry.serde.AbstractSchemaResolver.configure(AbstractSchemaResolver.java:87) at io.apicurio.registry.serde.DefaultSchemaResolver.configure(DefaultSchemaResolver.java:63) at io.apicurio.registry.serde.SchemaResolverConfigurer.configure(SchemaResolverConfigurer.java:78) at io.apicurio.registry.serde.AbstractKafkaSerDe.configure(AbstractKafkaSerDe.java:69) at io.apicurio.registry.serde.avro.AvroKafkaSerializer.configure(AvroKafkaSerializer.java:88) at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.configureSerializer(ReactiveKafkaProducer.java:87) at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.(ReactiveKafkaProducer.java:69) at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.(ReactiveKafkaProducer.java:45) at io.smallrye.reactive.messaging.kafka.impl.KafkaSink.(KafkaSink.java:76) at io.smallrye.reactive.messaging.kafka.KafkaConnector.getSubscriberBuilder(KafkaConnector.java:227) at io.smallrye.reactive.messaging.kafka.KafkaConnector_ClientProxy.getSubscriberBuilder(KafkaConnector_ClientProxy.zig:368) at io.smallrye.reactive.messaging.impl.ConfiguredChannelFactory.createSubscriberBuilder(ConfiguredChannelFactory.java:207) at io.smallrye.reactive.messaging.impl.ConfiguredChannelFactory.register(ConfiguredChannelFactory.java:164) at io.smallrye.reactive.messaging.impl.ConfiguredChannelFactory.initialize(ConfiguredChannelFactory.java:125) at io.smallrye.reactive.messaging.impl.ConfiguredChannelFactory_ClientProxy.initialize(ConfiguredChannelFactory_ClientProxy.zig:189) at java.util.Iterator.forEachRemaining(Iterator.java:133) at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658) at io.smallrye.reactive.messaging.extension.MediatorManager.start(MediatorManager.java:189) at io.smallrye.reactive.messaging.extension.MediatorManager_ClientProxy.start(MediatorManager_ClientProxy.zig:220) at io.quarkus.smallrye.reactivemessaging.runtime.SmallRyeReactiveMessagingLifecycle.onApplicationStart(SmallRyeReactiveMessagingLifecycle.java:41) at io.quarkus.smallrye.reactivemessaging.runtime.SmallRyeReactiveMessagingLifecycle_Observer_onApplicationStart_4e8937813d9e8faff65c3c07f88fa96615b70e70.notify(SmallRyeReactiveMessagingLifecycle_Observer_onApplicationStart_4e8937813d9e8faff65c3c07f88fa96615b70e70.zig:111) at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:300) at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:282) at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:70) at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:128) at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:97) at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(LifecycleEventsBuildStep$startupEvent1144526294.zig:87) at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(LifecycleEventsBuildStep$startupEvent1144526294.zig:40) at io.quarkus.runner.ApplicationImpl.doStart(ApplicationImpl.zig:765) at io.quarkus.runtime.Application.start(Application.java:101) at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:101) at io.quarkus.runtime.Quarkus.run(Quarkus.java:66) at io.quarkus.runtime.Quarkus.run(Quarkus.java:42) at io.quarkus.runtime.Quarkus.run(Quarkus.java:119) at io.quarkus.runner.GeneratedMain.main(GeneratedMain.zig:29

Could you please help me by review this also ?

hieunc278 commented 2 years ago

Dear @cescoffier ,

As I checked it again, it seems that the application could not find any instance of ApicurioHttpClientProvider, so when it call next() of this line

serviceLoader.providers(true).next();

it throw NoSuchElement exception as well. However, I haven't found any ideas to resolve it. Please support me

cescoffier commented 2 years ago

Which version are you using? Can you provide a reproducer?

hieunc278 commented 2 years ago

Dear @cescoffier,

Thanks for your feedback as well.

Version is 2.1.2.Final for both Quarkus and Apicurio.

I will try to create re-procedure code based on our current project.

As we saw, at normal case, it seems that ApicurioHttpClientProvider was set properly when starting to io.apicurio.rest.client.VertxHttpClientProvider by this method setProvider(ApicurioHttpClientProvider provider) of RegistryClientFactory.

But I still don't know why it was not called with my native, even it same pom file as well.

my pom file is :

`<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

4.0.0 io.becheetah native-service 1.0.0-SNAPSHOT 3.8.1 2.13.0 true 11 11 UTF-8 UTF-8 quarkus-bom io.quarkus.platform 2.1.1.Final 3.0.0-M5 2.1.2.Final 0.0.1 ${quarkus.platform.group-id} ${quarkus.platform.artifact-id} ${quarkus.platform.version} pom import io.quarkus quarkus-grpc io.apicurio apicurio-registry-serdes-avro-serde ${apicurio.version} jboss-interceptors-api_1.2_spec org.jboss.spec.javax.interceptor io.quarkus quarkus-hibernate-reactive io.quarkus quarkus-reactive-pg-client io.quarkus quarkus-smallrye-jwt io.quarkus quarkus-smallrye-jwt-build io.quarkus quarkus-arc com.fasterxml.jackson.core jackson-databind com.fasterxml.jackson.core jackson-core ${jackson.version} com.fasterxml.jackson.core jackson-annotations ${jackson.version} io.quarkus quarkus-container-image-jib io.quarkus quarkus-smallrye-reactive-messaging-kafka io.apicurio apicurio-registry-common ${apicurio.version} io.quarkus quarkus-rest-client io.quarkus quarkus-apicurio-registry-avro io.quarkus quarkus-junit5 test io.quarkus quarkus-resteasy-reactive io.apicurio apicurio-registry-rest-client 1.3.2.Final ${quarkus.platform.group-id} quarkus-maven-plugin ${quarkus.platform.version} true build generate-code generate-code-tests maven-compiler-plugin ${compiler-plugin.version} ${maven.compiler.parameters} maven-surefire-plugin ${surefire-plugin.version} org.jboss.logmanager.LogManager ${maven.home} native native maven-failsafe-plugin ${surefire-plugin.version} integration-test verify ${project.build.directory}/${project.build.finalName}-runner org.jboss.logmanager.LogManager ${maven.home} native

`

cescoffier commented 2 years ago

Hum, I think you mix an old apicurio extension from the quarkiverse with some new stuff. Please check https://github.com/quarkusio/quarkus-quickstarts/tree/main/kafka-avro-schema-quickstart.

hieunc278 commented 2 years ago

Dear @cescoffier ,

Thanks for your long supports as well.

It seems that you are right. It was resolved by removed Apicurio version when I added dependency.

--> From

io.apicurio apicurio-registry-serdes-avro-serde ${apicurio.version} jboss-interceptors-api_1.2_spec org.jboss.spec.javax.interceptor

--> To

io.apicurio apicurio-registry-serdes-avro-serde jboss-interceptors-api_1.2_spec org.jboss.spec.javax.interceptor

After edited, it will pull properly Apicurio version and work normally.

Now I could use with Avro through Kafka correctly.