I've repeatedly built "service container" or "corp kits" like the one
you're describing, as well as helped a number of orgs improve their
own versions of the thing in a consultant capacity. I think everyone
has the same reaction that you do: why are we duplicating all this
effort? But I can say with some breadth of experience that the
commonalities are fewer than they may appear. Once you take your e.g.
log shipper library, which is likely quite purpose-built not only for
your chosen MQ but the peculiarities of its runtime environment(s),
and provided switches and knobs to account for reasonable alternatives
to make it worth open-sourcing, you've rounded off a sufficient number
of corners to make it significantly less useful in your original
environment. The utility of these kits or containers is generally
proportional to how zero-conf they are: just use these pre-ordained
things, and you'll be good to go. Provide enough knobs to make them
generally useful, and the magic is replaced by config; new users,
faced with a sprawling YAML config and compiling in support for things
they'll never need, wonder why they can't eliminate all this cruft by
making a purpose-built jig for their specific conditions, and you're
back to square one. Advice from someone who's been down the path
enough times: accept as invariant that this code will never see the
light of open-source day, and hyper-specialize to your programming
environment, optimizing for ease-of-use. It's a better use of time and
energy.


On Wed, Dec 12, 2018 at 4:39 PM Zellyn <zel...@gmail.com> wrote:
>
> Hi folks,
>
> At Square, we have a collection of shared frameworks and library code, 
> loosely referred to as the “service container” in each language. For example, 
> our framework code in Go includes:
>
> a lightweight "module" system for dependency injection
> config: a way of layering yaml files named for environments. For instance, 
> common.yaml gets loaded first, and production.yaml shadows over it, and 
> production-east-coast.yaml gets applied last.
> logging: code for sending log lines over kafka to our logging aggregator
> networking: our stubby-alike protobuf RPC mechanism, naming and discovery, 
> etc. Gradually migrating to "just use grpc and envoy"
> datasource config: a convention for configuring database sources via the yaml 
> configs
>
> People probably also think of our service container as including slightly 
> less core things too:
>
> sharded jobqueues
> feature flags (backed by zookeeper)
> cron jobs (again configurable via yaml)
>
> This stuff has gone a while with less-than-generous attention and upkeep, and 
> the extent of Square-specific code makes it more difficult for new developers 
> to come up to speed.
>
> What I'm trying to figure out is: what are folks at other companies using to 
> create a shared set of conventions and out-of-the-box setup for their Go 
> applications? We can knock some pieces out one by one (eg. replace our Module 
> system with Wire), but it would be nice to find an existing lightweight 
> “service container” that other companies are using.
>
> I suppose my main question is this: is the kind of flexibility required for a 
> shared, open-source “service container” antithetical to the kind of simple, 
> opinionated, internal-convention-obeying “service container” you'd want for 
> your company? To put it another way, it has never felt like using gokit would 
> be appropriate, because it obeys none of our conventions.
>
> Thoughts, comments, experience to relate?
>
> Yours,
>
> Zellyn
>
> --
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to golang-nuts+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to