Hello! I think it is a strong side of Apache Ignite that it has a low number of JARs and minimal dependencies. It may be less relevant now than 10 years ago, but it's still a plus.
Not sure how fast it would evaporate as the number of JARs and dependencies grows. Regards, -- Ilya Kasnacheev чт, 10 дек. 2020 г. в 12:28, Anton Kalashnikov <kaa....@yandex.ru>: > Ilya, it is a good point about jar name. If it really unresolvable problem > we should leave modules name as is(I do not insist on renaming it was just > a proposal) > > I also not really got you point about 'zillion JARs'. Do you think it will > be a problem if the number of JARs increases a little? If so can you > clarify it with some specific examples? > > -- > Best regards, > Anton Kalashnikov > > > > 09.12.2020, 18:12, "Ilya Kasnacheev" <ilya.kasnach...@gmail.com>: > > Hello! > > > > When you do mvn dependencies:copy, you will now end up with > > "ignite-core-X.Y.Z.jar", "ignite-indexing-X.Y.Z.jar" > > But if we remove "ignite" from artifact name, user will end up with > cryptic > > "configuration.jar", "raft.jar", etc, etc. > > > > Remember that group name is discarded in file names. Therefore, every > > project out there keeps stuff like "spring-" or "hibernate-" in artifact > > name. > > > > I also hope that our users will not end up with zillion JARs. > > > > Regards, > > -- > > Ilya Kasnacheev > > > > ср, 9 дек. 2020 г. в 16:16, Anton Kalashnikov <kaa....@yandex.ru>: > > > >> Hello, > >> > >> I totally agree that we should start to think about the module > >> organization. > >> I suggest making the new confluence page where we define new rules on > how > >> to develop modules. > >> In my opinion, at least, the following topics should be covered > there(it > >> makes sense to discuss every topic separately, not here): > >> * In which cases new modules are required > >> * The naming of modules, packages > >> * Class dependency management ( inversion of control, no more context) > >> * Test organization ( module contains only unit, module tests. All > >> integration tests are in the extra module) > >> * Feature/Module lifecycle - experimental, stable, unstable, deprecated > >> > >> Let's get back to the original topic. I agree with the package naming > >> rule: > >> if the module name is configuration the package name should be > >> org.apache.ignite.configuration and only after that any other > subpackages. > >> Also, I don't sure that we need ignite- prefix in the module name > because > >> it doesn't have any extra information: > >> > >> <groupId>org.apache.ignite</groupId> > >> <artifactId>ignite-configuration</artifactId> > >> > >> we don't lose anything if convert it to > >> > >> <groupId>org.apache.ignite</groupId> > >> <artifactId>configuration</artifactId> > >> > >> I also hope that jigsaw can help us somehow with class visibility. > >> But if not we can take agreement that for example 'internal' package - > >> shouldn't be touched outside of the module - > >> of course, using the proper class access level is also the > solution(where > >> it is possible) > >> org.apache.ignite.configuration.Configurator // it has access to the > >> internal package but it shouldn't return any class from the internal > >> package only from the public one. > >> org.apache.ignite.configuration.DynamicProperty //interface > >> org.apache.ignite.configuration.internal.properties.IntDynamicProperty > >> > >> User API makes sense only for one end module - ignite(or ignite-core) > >> which depends on all other modules > >> and doing some integration(adapters) and provide final API for the > user. > >> So I agree that separated module Ignite-API with zero dependencies > will be > >> a good solution. > >> > >> configuration module: > >> Configurator.baseline().enabled() -> DynamicProperties > >> > >> ignite-api module: > >> BaselineConfiguration.enabled() -> boolean //interface > >> > >> ignite module: > >> BaselineConfigurationImpl implements BaselineConfiguration{ > >> Configurator configurator; > >> public boolean enabled(){ > >> return configurator.baseline().enabled().value(); > >> } > >> } > >> > >> So maybe my example is not so good. But I want to show that end-user > API > >> will be defined only in ignite-api > >> and you need to adapt it in ignite module which leads to some > >> overhead(especially in my example) > >> but it makes development pretty manageable/predictable - > >> you can easily implement a new module without any worries that user > starts > >> to use it. > >> It will be available only after making changes in ignite-api. > >> The major advantage here is the small size of ignite-api which allows > to > >> carefully review every change > >> which allows keeping ignite API in better quality(I hope at least) > >> > >> Nikolay, maybe is it better to discuss your question on a separate > topic? > >> Because looks like it is a pretty discussable topic. > >> > >> -- > >> Best regards, > >> Anton Kalashnikov > >> > >> 09.12.2020, 10:31, "Nikolay Izhikov" <nizhi...@apache.org>: > >> > Hello, Zhenya, Ivan. > >> > > >> >> Hello Nikolay, if i find out introduced features structure in some > >> project, i would prefer to choose different one ) > >> > > >> > Many, of the real world users disagree with you. > >> > Please, take a look at some examples from widely used projects: > >> > > >> > Kafka - > >> > https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/common/annotation/InterfaceStability.java#L28 > >> > - Stable, Evolving, Unstable > >> > > >> > Spark - > >> > https://github.com/apache/spark/tree/master/common/tags/src/main/java/org/apache/spark/annotation > >> > - AlphaComponent, DeveloperApi, Evolving, Experimental, Private, > >> Stable, Unstable > >> > > >> >> Having officially "unstable" features doesn't sound good for product > >> reputation. > >> > > >> > Can’t agree with you. > >> > > >> > Forcing ourselves to make perfect API from the first try we just put > too > >> much pressure on every decision. > >> > Every developer making mistakes. > >> > The product is evolving and the API too - it’s totally OK. > >> > > >> > For every new feature time required to be adopted and used in > real-world > >> production. > >> > I believe, slight API changes is totally fine for early adopters. > >> > Moreover, I think, that we should warn our users that some feature is > >> very fresh and can have issues. > >> > > >> > So, Why Kafka and Spark is good enough to have unstable API and > Ignite > >> not? :) > >> > > >> >> 9 дек. 2020 г., в 10:08, Ivan Bessonov <bessonov...@gmail.com> > >> написал(а): > >> >> > >> >> Conversation shifted into an unintended direction, but I agree. > >> >> > >> >> I think that if API can (or will) be changed then it should be > >> deprecated. > >> >> For that > >> >> we can introduce @IgniteDeprecated that will contain Ignite version > >> when > >> >> API is planned to be removed. Otherwise it's either stable or > >> experimental. > >> >> Having officially "unstable" features doesn't sound good for product > >> >> reputation. > >> >> > >> >> As for the modularization - I'm all for this idea. If we don't force > >> >> ourselves to > >> >> organize code properly then we'll end up with the same problems as > we > >> have > >> >> in the current code base. And this way there's a hope of having good > >> tests > >> >> that can be completed in minutes, not hours. At least new ones. > >> >> > >> >> BTW, did we have any discussions about dependency injection and all > >> this > >> >> stuff? > >> >> Seems like a related topic to me. > >> >> > >> >> ср, 9 дек. 2020 г. в 09:47, Zhenya Stanilovsky > >> <arzamas...@mail.ru.invalid>: > >> >> > >> >>> Hello Nikolay, if i find out introduced features structure in some > >> >>> project, i would prefer to choose different one ) > >> >>> > >> >>>>>> Hello, Alexey. > >> >>>>>> > >> >>>>>> Think we can extend our @IgniteExperimental annotation. > >> >>>>>> > >> >>>>>> `@IgniteExperimental` - mark features that are truly > experimental > >> and > >> >>> can be completely removed in future releases. > >> >>>>>> `@NotRecommended` - mark features that widely adopted by the > users > >> but > >> >>> implemented wrong or have known issues that can’t be fixed. > >> >>>>>> `@NotStable` - mark features supported by community but API not > >> stable > >> >>> and can be reworked in the next release. > >> >>>>>> `@Stable` - mark features that are completely OK and here to > stay. > >> >>>>>> > >> >>>>>> We should output notes about these annotations in the JavaDoc, > >> also. > >> >>>>>> What do you think? > >> >>>>>> > >> >>>>>>> 8 дек. 2020 г., в 12:49, Alexey Goncharuk < > >> >>> alexey.goncha...@gmail.com > написал(а): > >> >>>>>>> Igniters, > >> >>>>>>> > >> >>>>>>> I want to tackle the topic of modules structure in Ignite 3. So > >> far, > >> >>> the > >> >>>>>>> modules in Ignite are mostly defined intuitively which leads to > >> some > >> >>>>>>> complications: > >> >>>>>>> > >> >>>>>>> - Ignite public API is separated from the rest of the code > only by > >> >>>>>>> package name. This leads to private classes leaking to public > API > >> >>> which is > >> >>>>>>> very hard to catch even during the review process (we missed a > >> bunch > >> >>> of > >> >>>>>>> such leaks for new metrics API [1] and I remember this > happening > >> for > >> >>> almost > >> >>>>>>> every SPI) > >> >>>>>>> - Classes from 'internal' packages are considered to be 'free > for > >> >>> grabs' > >> >>>>>>> in every place of the code. This leads to tight coupling and > >> >>> abstraction > >> >>>>>>> leakage in the code. An example of such a case - an often cast > of > >> >>>>>>> WALPointer to FileWALPointer, so that the community decided to > get > >> >>> rid of > >> >>>>>>> the WALPointer interface altogether [2] > >> >>>>>>> - Overall code complexity. Because of the lack of inter-module > >> >>>>>>> interaction rules, we are free to add new methods and callbacks > >> to any > >> >>>>>>> class, which leads to duplicating entities and verbose > >> interfaces. A > >> >>> good > >> >>>>>>> example of this is the clear duplication of methods in > >> >>>>>>> IgniteCacheOffheapManager and > IgniteCacheOffheapManager.DataStore > >> [3] > >> >>>>>>> > >> >>>>>>> I think we need to work out some rules that will help us define > >> and > >> >>> control > >> >>>>>>> both Ignite public API and module internal API which still > >> defines a > >> >>> clear > >> >>>>>>> contract for other modules. Some ideas: > >> >>>>>>> > >> >>>>>>> - Perhaps we can move all user public classed and interfaces > to an > >> >>>>>>> Ignite-API module which will have no dependencies on > >> implementation > >> >>>>>>> modules. This will prevent private classes from leaking to the > API > >> >>> module. > >> >>>>>>> - We need somehow define which classes from a module are > exposed > >> to > >> >>>>>>> other modules, and which classes are left for module-private > >> usage. > >> >>> Maybe > >> >>>>>>> Java's jigsaw will help us here, but maybe we will be ok with > just > >> >>> more > >> >>>>>>> strict java access modifiers usage :) The idea here is that a > >> module > >> >>> should > >> >>>>>>> never touch a dependent module's private classes, ever. The > >> exported > >> >>>>>>> classes and interfaces are still free to be modified between > >> >>> releases, as > >> >>>>>>> long as it is not a user public API. > >> >>>>>>> - A module should be logically complete, thus it may be > >> beneficial if > >> >>>>>>> module name matches with the code package it provides (e.g. > >> >>> configuration > >> >>>>>>> -> org.apache.ignite.configuration, replication -> > >> >>>>>>> org.apache.ignite.replication, raft->org.apache.ignite.raft, > etc) > >> >>>>>>> > >> >>>>>>> Any other principles/rules we can apply to make the code > structure > >> >>> more > >> >>>>>>> concise? Thoughts? > >> >>>>>>> > >> >>>>>>> --AG > >> >>>>>>> > >> >>>>>>> [1] https://issues.apache.org/jira/browse/IGNITE-12552 > >> >>>>>>> [2] https://issues.apache.org/jira/browse/IGNITE-13513 > >> >>>>>>> [3] https://issues.apache.org/jira/browse/IGNITE-13220 > >> >> > >> >> -- > >> >> Sincerely yours, > >> >> Ivan Bessonov >