[ 
https://issues.apache.org/jira/browse/KAFKA-3487?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15336254#comment-15336254
 ] 

Randall Hauch commented on KAFKA-3487:
--------------------------------------

I hope this can move toward an approach that can eventually support the Jigsaw 
module system that appears to be coming in JDK9. Jigsaw relies upon the 
standard Java service loader mechanism (added in JDK6) to find all 
implementations of an interface, and Jigsaw will then properly handle all 
dependencies and class loading.

A pre-JDK9 approach is to use a configuration parameter for the workers (e.g., 
a connector module path) that simply lists the directories in which Kafka 
Connect can find each connector "module". The connector module's directory 
would contain all of the JARs required by the connector. Upon startup, Kafka 
Connect could iterate through this list of paths, and for each: create a URL 
classloader (that inherits the parent classpath), pass the URL classloader to 
the service loader method to load the connector implementation class (without 
having to know its name), create a {{ConnectorModule}} object with the URL 
classloader and reference to the connector class, and then load the 
{{ConnectorModule}} into an internal registry keyed by name. Then, the rest of 
Kafka Connect would simply use the registry.

Really, this same registry could also be used to find all implementations 
available on the current classloader, meaning it would work with connectors 
that don't define a 
{{META-INF/services/org.apache.kafka.connect.connector.Connector}} file for the 
service loader.

And, to add support for JDK9, upon startup Kafka Connect would simply use the 
service loader to locate all {{Connector}} implementation classes, and populate 
the same registry, using a different {{ConnectorModule}} implementation that 
simply instantiates the class and relying upon JDK9 modules to properly handle 
all of the classloading and isolation. The rest of the Kafka Connect remains 
unchanged.

The only change to connector implementations is to add support for the service 
loader, and since that's going to be required by JDK9 it might be worth doing 
now. And, doing this now would greatly simply the implementation.


> Support per-connector/per-task classloaders in Connect
> ------------------------------------------------------
>
>                 Key: KAFKA-3487
>                 URL: https://issues.apache.org/jira/browse/KAFKA-3487
>             Project: Kafka
>          Issue Type: New Feature
>          Components: KafkaConnect
>    Affects Versions: 0.10.0.0
>            Reporter: Ewen Cheslack-Postava
>            Assignee: Liquan Pei
>            Priority: Critical
>              Labels: needs-kip
>
> Currently we just use the default ClassLoader in Connect. However, this 
> limits how we can compatibly load conflicting connector plugins. Ideally we 
> would use a separate class loader per connector/task that is instantiated to 
> avoid potential conflicts.
> Note that this also opens up options for other ways to provide jars to 
> instantiate connectors. For example, Spark uses this to dynamically publish 
> classes defined in the REPL and load them via URL: 
> https://ardoris.wordpress.com/2014/03/30/how-spark-does-class-loading/ But 
> much simpler examples (include URL in the connector class instead of just 
> class name) are also possible and could be a nice way to more support dynamic 
> sets of connectors, multiple versions of the same connector, etc.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to