<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wikidot="http://www.wikidot.com/rss-namespace">

	<channel>
		<title>Comments for page &quot;nanomsg: Towards Full-Blown Configuration Management&quot;</title>
		<link>http://250bpm.com/blog:26/comments/show</link>
		<description></description>
				<copyright></copyright>
		<lastBuildDate>Sat, 01 Aug 2015 21:42:31 +0000</lastBuildDate>
		
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1957383</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1957383</link>
				<description></description>
				<pubDate>Wed, 05 Feb 2014 13:04:10 +0000</pubDate>
				<wikidot:authorName>David Beckwith</wikidot:authorName>								<content:encoded>
					<![CDATA[
						 <p>Interesting discussion.</p> <p>In an ideal world, where system administrators are either</p> <p>A. all doping on happy pills and are highly cooperative or<br /> B. they do not exist</p> <p>The DNS solution is the best solution i think. Random thought: make a small DNS server available to the app.</p> <p>Random thought #2</p> <p>Assuming that either topology could fit into memory, the topology entity should be a data structure (in C) with a CRUD API. Config files or other ways to manage the toplogy would be built on top of the CRUD API. Internally, listener functions will bi-directionally sync the topology data structure with the actual topology of the network. The data structure could also publish changes to an INPROC, IPC, or TCP connection so that you could build real-time visualizations of the topology.</p> <p>If the fits-in-memory assumption is too strong for your taste, then I vote for DNS or mini-DNS .</p> <p>Either way, it seems like a separate project from nanomsg.</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1896376</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1896376</link>
				<description></description>
				<pubDate>Tue, 19 Nov 2013 14:54:34 +0000</pubDate>
				<wikidot:authorName>Bardur Arantsson</wikidot:authorName>								<content:encoded>
					<![CDATA[
						 <p>Re: port multiplexing. That's excellent, though the &quot;port&quot; bit is really just a detail &#8212; my point is really that if there's <strong>some</strong> exclusive resource which cannot easily be configured for test setups then that becomes a problem for parallel testing.</p> <p>I suppose the worst case here really is parallel testing of the <strong>same</strong> application &#8212; let's say we want to run tests for all branches of an application (on push).</p> <p>The second point basically just goes to the possibility of isolating test configuration from &quot;real&quot; configuration &#8212; I think partially related to your point 3 (identification), but a bit broader, I think. Let's assume that I want to run tests for two (or more) applications (in parallel or otherwise) or multiple instances of the same application. Is there some way to have:</p> <ul> <li>a different setup for each application such that they won't conflict regardless of whatever setup they require (ports, endpoints, etc.)?</li> <li>can they run in parallel?</li> <li>can I modify the application's networking topology (configuration) without having to reconfigure the (physical) build slaves or messing around with a separate configuration &quot;database&quot; (DNS, DHCP, &#8230;)? Ideally, I'd like to be able to bundle the configuration with the code to avoid external dependencies. External dependencies in tests make for very fragile tests in my experience. Building/testing multiple branches of the same application in parallel is also a use case here.</li> <li>can I use identical build slaves to run all my tests? (Matters for <strong>performance</strong> of building/multiple branches of the same application on every checkin.)</li> <li>can I avoid nanomsg-specific (manual) setup on my development machine?</li> </ul> <p>AFAICT a simple configuration file (not globally installed) lets one support all of these scenarios, but any kind of &quot;global&quot; configuration (DNS, DHCP, etc.) could place severe limits on what can be done in these cases.</p> <p>(There's a lot of overlap between these issues and the issues with integration testing against &quot;real&quot; databases.)</p> <p>Maybe I've just missed something, though. I just wanted to bring your attention to these issues before it's too late :)</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1896309</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1896309</link>
				<description></description>
				<pubDate>Tue, 19 Nov 2013 12:53:23 +0000</pubDate>
				<wikidot:authorName>Martin Sustrik</wikidot:authorName>								<content:encoded>
					<![CDATA[
						 <p>As for the issue with TCP ports, look here: <a href="http://250bpm.com/blog:18">http://250bpm.com/blog:18</a> At the end, there's a proposed solution for multiplexing over a single TCP port. I've already done some of the implementation work, actually.</p> <p>As for the other point, I don't really follow. May you elaborate?</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1896290</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1896290</link>
				<description></description>
				<pubDate>Tue, 19 Nov 2013 12:24:51 +0000</pubDate>
				<wikidot:authorName>Bardur Arantsson</wikidot:authorName>								<content:encoded>
					<![CDATA[
						 <p>What about testing?</p> <p>There are (at least) two annoyances in (integration) testing with current networking stacks:</p> <ul> <li>If you want to run tests in parallel you need to somehow pick an unused port. This is the case even if you're testing different applications (if you're running tests on a CI server, for example) which just happen to use overlapping sets of ports. This is actually a huge annoyance in practice even though it's actually not a theoretically difficult problem by any stretch.</li> <li>If you have any even remotely complicated setup you may be forced into setting up your CI build slaves with complicated networking setups.</li> </ul> <p>Given that nanomsg really &quot;just&quot; provides a virtual network on top of IP, it seems to me that omitting a &quot;user provides all configuration&quot; (via files or whatever) option would be a mistake when it comes to testing support. Such configuration would actually also have to be per-context (in ZMQ terminology) to enable parallel testing without spawning multiple instances of the application &#8212; usually spawning separate instances of the application would not be a problem, but it is a <em>big</em> problem if you're running with a managed runtime (JVM or .Net equivalent, for example) because of the startup time.</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1854814</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1854814</link>
				<description></description>
				<pubDate>Thu, 19 Sep 2013 08:04:57 +0000</pubDate>
				<wikidot:authorName>martin_sustrik</wikidot:authorName>				<wikidot:authorUserId>939</wikidot:authorUserId>				<content:encoded>
					<![CDATA[
						 <p>That's interesting. I haven't even though of DHCP as an option.</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1853180</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1853180</link>
				<description></description>
				<pubDate>Mon, 16 Sep 2013 21:05:02 +0000</pubDate>
				<wikidot:authorName>Eduardo Morras</wikidot:authorName>								<content:encoded>
					<![CDATA[
						 <p>You can look how sqlite pragmas work. You can configure sqlite at compile time as usual and /or sending pragmas, this manner you can modify threading support, buffer memory, wal mode and a long list of different settings, some of them at running time.</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1852950</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1852950</link>
				<description></description>
				<pubDate>Mon, 16 Sep 2013 14:00:50 +0000</pubDate>
				<wikidot:authorName>Eduardo Morras</wikidot:authorName>								<content:encoded>
					<![CDATA[
						 <p>You can use DHCP for this. Check this old (2004) presentation, where Yannick Cadin explains how to use a DHCP server to send configuration to several applications, not only dns config, ip, ntp and other minimal config.</p> <p>HTH</p> <p><a href="http://2004.eurobsdcon.org/uploads/media/EBSD04_slides_41.pdf">http://2004.eurobsdcon.org/uploads/media/EBSD04_slides_41.pdf</a></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1850548</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1850548</link>
				<description></description>
				<pubDate>Thu, 12 Sep 2013 13:21:16 +0000</pubDate>
				<wikidot:authorName>martin_sustrik</wikidot:authorName>				<wikidot:authorUserId>939</wikidot:authorUserId>				<content:encoded>
					<![CDATA[
						 <p>Ah, it's you :) I haven't realised.</p> <p>As a historical analogy, consider that once it must have been inconceivable that you could simply speak to any other box by specifying only its address: &quot;You know, this new IP thing makes me feel uneasy. Just imagine that the admins are supposed to re-arrange the network without understanding how the applications work. And with no changes to the code. It seems like Vint and Bob are completely off the track.&quot;</p> <p>Thus, let's treat it as a challenge. At the moment we have no way to build network-layout-unaware applications. Wouldn't it be nice to have that one day?</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1850531</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1850531</link>
				<description></description>
				<pubDate>Thu, 12 Sep 2013 12:48:20 +0000</pubDate>
				<wikidot:authorName>Alan</wikidot:authorName>								<content:encoded>
					<![CDATA[
						 <p>We don't have hobby projects at Spotify :-)</p> <p>1. The software is generic. It will be sold to multiple customers&#8230;<br /> Agreed.</p> <p>2. The software is single-purpose and will be deployed at a single site&#8230;<br /> I'm not sure I agree with your ~10 years assertion, but I get the point you're trying to make. It just makes me a little nervous that someone can potentially reorganise a system topology without a full understanding of how it works. And without any changes to the code. I just don't think this fits with reality.</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1850472</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1850472</link>
				<description></description>
				<pubDate>Thu, 12 Sep 2013 09:07:35 +0000</pubDate>
				<wikidot:authorName>martin_sustrik</wikidot:authorName>				<wikidot:authorUserId>939</wikidot:authorUserId>				<content:encoded>
					<![CDATA[
						 <p>My understanding is that you almost never know how the production network will look like. It may be the case with your personal hobby projects, but elsewhere there are only 2 options:</p> <p>1. The software is generic. It will be sold to multiple customers and deployed in their environments. Programmer has no idea what will those networks look like.</p> <p>2. The software is single-purpose and will be deployed at a single site the programmer is familiar with. Even in such case, time has to be taken into account. Typical lifespan of an enterprise product is ~10 years. During that time the underlying network is going to change significantly. Companies grow and merge, new technologies are introduced etc. In short, when writing the software, the programmer has no idea what network it will be running on in the future.</p> <p>Anyway, as for separation of core functionality and configuration functionality, I am much in favor of that, however, I don't know how to do that without hurting user experience much (see one of my comments above).</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1850450</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1850450</link>
				<description></description>
				<pubDate>Thu, 12 Sep 2013 08:07:41 +0000</pubDate>
				<wikidot:authorName>Alan</wikidot:authorName>								<content:encoded>
					<![CDATA[
						 <p>If you have no idea how the network looks in the production environment, then you're already heavily compromised as a system designer.</p> <p>It sounds like you have a totally different view on this, presumably based on feedback you've received that people really want to write generic components that can be glued together in various configurations by a team of people who don't necessarily have intimate knowledge of how these components work.</p> <p>Anyway, my point was that I hope nanomsg continues to offer a simple interface for connecting and binding sockets while perhaps supporting an additional interface to support a richer feature set for socket configuration. It sounds like this is your plan so that makes me happy :-)</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1850439</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1850439</link>
				<description></description>
				<pubDate>Thu, 12 Sep 2013 07:17:03 +0000</pubDate>
				<wikidot:authorName>martin_sustrik</wikidot:authorName>				<wikidot:authorUserId>939</wikidot:authorUserId>				<content:encoded>
					<![CDATA[
						 <p>Well, how would you do that if you don't know how the network in the production environment looks like?</p> <p>As for bound/connected it's seen often in the wild. Say, in dev env you bind a service a let clients connect to it. In prod env you start a device and let the service connect to it.</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1850437</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1850437</link>
				<description></description>
				<pubDate>Thu, 12 Sep 2013 07:09:32 +0000</pubDate>
				<wikidot:authorName>Alan</wikidot:authorName>								<content:encoded>
					<![CDATA[
						 <p>I think I tend to agree with the view that nanomsg should be first and foremost a networking library so I'd be hesitant to start blending into it config management. On paper it perhaps looks like a good idea, but my feeling is that it most likely won't fit most people's requirements fully and would suffer dreaded feature creep as a result.</p> <p>I also disagree with your assertion that admins demand the power to dictate whether sockets are bound or connected. Of course, things like connect addresses, ports, etc should be under the control of admins but it sounds like you'd like to delegate topology decisions and architectural design to a group of people who would perhaps consider it the system developers responsibility to build a sane, fault resistant and scalable system.</p> <p>This is certainly my experience when building backend systems at scale. I would rather submit a newly developed system that has been architecturally designed against a topology model that's been peer reviewed, than to simply hand over a collection of components and say &quot;we'll, it's up to you now&#8230;&quot;.</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1850425</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1850425</link>
				<description></description>
				<pubDate>Thu, 12 Sep 2013 06:06:17 +0000</pubDate>
				<wikidot:authorName>martin_sustrik</wikidot:authorName>				<wikidot:authorUserId>939</wikidot:authorUserId>				<content:encoded>
					<![CDATA[
						 <p>I would love to have the two fully separated myself.</p> <p>The problem with that is that that way you would get 2 sets of APIs:</p> <p>nn_socket vs. nn_config_socket, nn_connect vs. nn_config_connect etc.</p> <p>That in turn means that every language binding would have to split into 2 projects, one providing access to the library, other one providing access to the config service.</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1850161</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1850161</link>
				<description></description>
				<pubDate>Wed, 11 Sep 2013 21:41:13 +0000</pubDate>
				<wikidot:authorName>ovmjm</wikidot:authorName>								<content:encoded>
					<![CDATA[
						 <p>I'm far from being an expert in configuration management, but i'm quite sure that there are many ways of solving the problem, all better than the others given a particular context (technology, legacy, security, philosophy, corporate guidelines, personnal habits, etc).</p> <p>I tend to believe that the fewer roles a component has the better it is. Then ability to compose several pieces together at will is Freedom.</p> <p>I still haven't got time to dive deep into the source of nanomsg, but what appealed to me from the outside was its name, that it is written in c, has minimal api and a modular protocol system.</p> <p>It would be nice to have another beautiful piece of software dedicated to solve the specific problem of configuring network topologies but I think it should be fully decorelated from nanomsg.</p> <p>Thanks again for your blog and your work on nanomsg.</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1849771</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1849771</link>
				<description></description>
				<pubDate>Wed, 11 Sep 2013 06:29:12 +0000</pubDate>
				<wikidot:authorName>martin_sustrik</wikidot:authorName>				<wikidot:authorUserId>939</wikidot:authorUserId>				<content:encoded>
					<![CDATA[
						 <p>As for the URLs mapping to config into, yes, that's what being discussed currently. Paul Colomiets made a nice prototype for that and was able to set up a rather complex topology with it:</p> <p><a href="https://docs.google.com/file/d/0Byd_FTQksoKLY3lyZnlQalFtRnc/edit">https://docs.google.com/file/d/0Byd_FTQksoKLY3lyZnlQalFtRnc/edit</a></p> <p>As for the dynamic updates, that's basically the DNS solution. You update the DNS records and they get automatically propagated everywhere.</p> <p>As for the local configuration of the library, that's why &quot;pluggable&quot; configaration service was discussed. The idea was that you can plug in a component that reads the config info from a config file, one that reads it from DNS or yet another that reads if from MySQL.</p> <p>That being said, there are some questions to answer about local config files. Specifically, as Jiri Sedlacek notes above, if the configuration file is local, why not make it part of the application's config file. That defintely makes sense, but kills the idea of having a single generic mechanism for retrieving config into (the format of app's config file can be different for each app).</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1849738</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1849738</link>
				<description></description>
				<pubDate>Wed, 11 Sep 2013 04:45:58 +0000</pubDate>
				<wikidot:authorName>sasbury</wikidot:authorName>								<content:encoded>
					<![CDATA[
						 <p>As someone that worked at TIBCO i think it is worth folks looking at FTL in this context. FTL provides a central configuration management solution. This has some very useful applications. However, I also think FTL suffers by not offering a way for customers to configure the library locally.</p> <p>FTL uses a JSON configuration format. Which I think is a reasonable way to go with nanomsg. The library could provide a simple API for getting that JSON from somewhere else (mongodb, a rest api, a web server, &#8230;) as a URL, providing the JSON as a string, or building library elements manually.</p> <p>If you want to go a step further, FTL provides dynamic updates, where changes made at the central server are pushed out to the clients.</p> <p>Anyway, I think FTL offers a nice model for this option and is worth looking at.</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1849188</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1849188</link>
				<description></description>
				<pubDate>Tue, 10 Sep 2013 09:49:26 +0000</pubDate>
				<wikidot:authorName>martin_sustrik</wikidot:authorName>				<wikidot:authorUserId>939</wikidot:authorUserId>				<content:encoded>
					<![CDATA[
						 <p>nanomsg is meant to be a part of networking stack. Right now it's in user-space library, but the long-term prospect is to make it part of the kernel.</p> <p>As an analogy, let's think of TCP/IP stack. Once it was not integral part of the operating system, rather a stand-alone library.</p> <p>Back then it could be argued that it's not the task of the library to configure itself. Rather, every application should supply all IP configuration options itself.</p> <p>Fortunately, that's not what happened. Today, IP is configured on the machine-wide basis and applications can simply use it without having to deal with the configuration of the stack.</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1849185</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1849185</link>
				<description></description>
				<pubDate>Tue, 10 Sep 2013 09:37:57 +0000</pubDate>
				<wikidot:authorName>martin_sustrik</wikidot:authorName>				<wikidot:authorUserId>939</wikidot:authorUserId>				<content:encoded>
					<![CDATA[
						 <p>That's a pretty relevant argument. In short, if there's already an application config file, why not store the topology info in that file as well?</p> <p>My thinking about it is that the topology and the application are conceptually different entities. For example, you can have a pub/sub topology for distributing weather forecasts that can be used by many different applications. Someone sets the topology first, makes sure that the data flow through etc. Then the applications can be written to consume the data from the topology.</p> <p>In other words, topology is a full-blown stand-alone entity. It exists even if no application is connected to it, same way as network infrastructure exists even though no data is passed through at the moment.</p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://250bpm.com/blog:26/comments/show#post-1849173</guid>
				<title>(no title)</title>
				<link>http://250bpm.com/blog:26/comments/show#post-1849173</link>
				<description></description>
				<pubDate>Tue, 10 Sep 2013 09:21:53 +0000</pubDate>
				<wikidot:authorName>Graeme Mathieson</wikidot:authorName>								<content:encoded>
					<![CDATA[
						 <p>Personally, I wouldn't worry too much about pluggable systems to store configuration data. The &quot;public&quot; interface for configuration information can be a configuration file. It works for almost every other system service I work with. I can then use something external (puppet, chef, a bunch of home grown shell scripts talking to MySQL, whatever) to generate that configuration file. Doing it this way neatly decoupling the actual config from the way it's stored and distributed, and means you don't have to care about supporting a whole bunch of extra dependencies.</p> <p>That said, I think there's a certain elegance to storing the connection information as SRV records in DNS. :) Then you just need to configure applications to look for a well known service name to get the connection details. On the other hand, that's not really flexible enough to distribute anything more than host/port information, so you still need admin configuration files&#8230;</p> <p>On the third hand, nanomsg is fundamentally a library, and it's not the &quot;role&quot; of the library to configure itself. That's the responsibility of the host application it's integrated with. I personally dislike the notion that log4j has its own separate configuration file in every Java app I deploy, for example (while the log4j config format is consistent across apps, the actual configuration data is very app specific, so there's no real benefit to it being in a separate configuration file!). Perhaps the goal of nanomsg is to make the API amenable to easy configuration (though I'm not sure exactly what that means!)?</p> <p>Anyway, this is random drive-by commenting from an outsider, who doesn't understand the broader conversation, so feel free to take it with a pinch of salt. ;-)</p> 
				 	]]>
				</content:encoded>							</item>
				</channel>
</rss>