Hi Jonah, This is quite comparable to micro-services - each service is an abstraction or at least a facade and wants to play in a bigger system, but each micro-service may itself have its own stateful graph to maintain.
I think I will explore my original direction of having a AComponentWhichDrivesAnEntireSystem and see how far I get with that. On Wednesday, 11 March 2015 20:53:45 UTC, jonah wrote: > > Hey Colin, it sounds like: > > * if the 2 systems really can't function without each other, and their > start/stop lifecycles are tightly bound, then somehow they have to be > merged into a single system > > or > > * if the 2 systems can't be merged into a single system because of true > functional or lifecycle independence and non-overlapping dependencies, then > semantics for what it means for each system to not have the other available > at lifecycle event times have to be established > > It smells like the latter may be the way to go. So in pseudocode, the > reusable-component-system that "owns" the reusable-component would not > receive an instance of the external-collaborator at creation time. Instead, > the reusable-component would have a somewhat weaker definition of its start > semantics, and perhaps would have a way to refer to the > external-collaborator only by name. > > That is, perhaps the external-collaborator provided to the > reusable-component is really an external-collaborator-client that is > configured to know the name of the external-collaborator- which is owned by > larger-system- and shields the reusable-component in cases where the larger > system has not been started or the collaborator isn't available. > > And perhaps similarly the larger-system has a reusable-component-client or > reusable-client-proxy that is able to bridge appropriately from > larger-system to the reusable-component. > > And maybe both client components are configured with the same :bus for > cross-system communication (and perhaps the cross-system bus is owned by a > bridge system). Just riffing, as it's not precisely clear what the > semantics of the systems are. > > Stuart's comment that he hasn't run into a need for systems of systems is > coming to mind. Perhaps it makes sense to break these apart more explicitly > in accordance with guidelines around managing micro-services. Easy to say, > of course. :) > > Not sure if that's helpful.... > > Jonah > > > > On Wed, Mar 11, 2015 at 3:01 PM, Colin Yates <colin...@gmail.com > <javascript:>> wrote: > >> merge won't help as there will be name space clashes. >> >> I wonder if a more elegant approach would be to construct the 'inner' >> system and then assoc onto it the external dependencies it needs >> before calling start. >> >> On 11 March 2015 at 18:49, <adrian...@mail.yu.edu <javascript:>> wrote: >> > I believe I misunderstood your question; I didn't realize it was system >> (as >> > opposed to any general component) specific. I think systems can be >> merged >> > together (via 'merge'). Would that help? >> > >> > On Wednesday, March 11, 2015 at 2:40:14 PM UTC-4, Colin Yates wrote: >> >> >> >> Hi Adrian - I don't follow how that helps integrate two different >> >> systems - I wonder if my question was unclear or I am missing >> >> something in your answer. Would you mind posting some pseudo code to >> >> clarify please? >> >> >> >> On 11 March 2015 at 18:32, <adrian...@mail.yu.edu> wrote: >> >> > You can specify component dependencies using the 'using' function as >> you >> >> > know. As long as you know the key of the component in the system you >> can >> >> > specify this dependency wherever you construct the component. If you >> >> > want to >> >> > parameterize dependencies, write a constructor function which takes >> the >> >> > external dependency as a value. >> >> > >> >> > On Wednesday, March 11, 2015 at 2:17:12 PM UTC-4, Colin Yates wrote: >> >> >> >> >> >> I have a non-trivial component which requires a bunch of internal >> and >> >> >> external collaborators to work. This component is itself re-usable. >> >> >> >> >> >> What I really want to do is have ReusableComponent be a component >> in a >> >> >> system so it can pull its external collaborators. However, >> >> >> ReusableComponent >> >> >> constructs its own services etc. so it really want to be (or at >> least >> >> >> have >> >> >> access to) a system. >> >> >> >> >> >> For example, let's say I have the following: >> >> >> >> >> >> (defrecord InternalToReusableComponent [bus] >> >> >> (component/Lifecycle >> >> >> (start [this]...)) >> >> >> >> >> >> (defrecord ReusableComponent [bus logger] >> >> >> (component/Lifecycle >> >> >> (start [this] >> >> >> >> >> >> this) >> >> >> ....)) >> >> >> >> >> >> (defn reusable-component-system [external-collaborator] >> >> >> (component/system-map >> >> >> :bus (....) >> >> >> :logger (....) >> >> >> :reusable-component (component/using (map->ReusableComponent {}) >> >> >> [:bus >> >> >> :logger external-collaborator])) >> >> >> >> >> >> Fine - I now have a system from which I can pull the reusable >> >> >> component. >> >> >> However, where does 'external-collaborator' come from? Obviously >> there >> >> >> is a >> >> >> larger system which I want this component to be part of so I can do: >> >> >> >> >> >> (defn larger-system [] >> >> >> (component/system-map >> >> >> :external-collaborator (...) >> >> >> :reusable-component (component/using (some-magic-glue) >> >> >> [:external-collaborator]))) >> >> >> >> >> >> I am struggling to see what (some-magic-glue) should be. I imagine >> it >> >> >> needs to be something like: >> >> >> >> >> >> (defrecord SystemAdaptor [external-collaborator internal-system] >> >> >> component/Lifecycle >> >> >> (start [this] >> >> >> (let [internal-system (or internal-system >> >> >> (reusable-component-system >> >> >> external-collaborator)) >> >> >> internal-system (component/start internal-system)] >> >> >> (assoc this :internal-system internal-system))) >> >> >> (stop [this] >> >> >> (let [internal-system (:internal-system this) >> >> >> internal-system (component/stop internal-system] >> >> >> (assoc this :internal-system internal-system))) >> >> >> >> >> >> but it all feels a bit yuck. >> >> >> >> >> >> I can't merge the two systems because the reusable component is >> chocka >> >> >> full of very fine grained command handlers and both the internal and >> >> >> external systems will have their own 'bus' for example. I could >> >> >> namespace >> >> >> the keys but that again feels painful... >> >> >> >> >> >> Hope that is clear - and I look forward to your thoughts :). >> >> > >> >> > -- >> >> > You received this message because you are subscribed to the Google >> >> > Groups "Clojure" group. >> >> > To post to this group, send email to clo...@googlegroups.com >> >> > Note that posts from new members are moderated - please be patient >> with >> >> > your >> >> > first post. >> >> > To unsubscribe from this group, send email to >> >> > clojure+u...@googlegroups.com >> >> > For more options, visit this group at >> >> > http://groups.google.com/group/clojure?hl=en >> >> > --- >> >> > You received this message because you are subscribed to the Google >> >> > Groups >> >> > "Clojure" group. >> >> > To unsubscribe from this group and stop receiving emails from it, >> send >> >> > an >> >> > email to clojure+u...@googlegroups.com. >> >> > For more options, visit https://groups.google.com/d/optout. >> > >> > -- >> > You received this message because you are subscribed to the Google >> > Groups "Clojure" group. >> > To post to this group, send email to clo...@googlegroups.com >> <javascript:> >> > Note that posts from new members are moderated - please be patient with >> your >> > first post. >> > To unsubscribe from this group, send email to >> > clojure+u...@googlegroups.com <javascript:> >> > For more options, visit this group at >> > http://groups.google.com/group/clojure?hl=en >> > --- >> > You received this message because you are subscribed to the Google >> Groups >> > "Clojure" group. >> > To unsubscribe from this group and stop receiving emails from it, send >> an >> > email to clojure+u...@googlegroups.com <javascript:>. >> > For more options, visit https://groups.google.com/d/optout. >> >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clo...@googlegroups.com >> <javascript:> >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+u...@googlegroups.com <javascript:> >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en >> --- >> You received this message because you are subscribed to the Google Groups >> "Clojure" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to clojure+u...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.