<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="266225" data-post-id="266225">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sb8244" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sb8244/120/18642_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sb8244
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Real-Time Phoenix</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I have waffled on how to best support PushEx in an existing app over time. My initial gut reaction is that I don’t think it’s a good idea because your app servers will deploy more frequently than PushEx servers, which may result in missed messages. This is why it’s not supported today.</p>
<p>I may explore this in the future, but I’m not aware of a seamless way to integrate a complete Phoenix app into an existing app. You would need to copy the router and relevant endpoint code into your app, but there are most likely more steps. I don’t think you want 2 Endpoint modules in this case.</p>
<p>I can’t put time into this now, but if anyone wants to tackle it, I’d be happy to upstream.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="266225" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/real-time-phoenix-pragprog/24808/135">Post #134</a>
	                </div>
	            </div>
              <div id="likers-container-266225" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="266225"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #134"></div>
  </section>
</div>
    <div class="postbit" id="266229" data-post-id="266229">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="maz" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/maz/120/6075_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  maz
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks for the clarification. So going by what you’ve said, in theory I could make at least one(or a cluster if need be) of PushEx-based web apps(each of which have a single Endpoint) that effectively feed into my “main” web app(the main web app is clustered along with them but has a Server role, as described in Real-time Phoenix)?</p>
<p>I suppose I could not use Pushex at all and just manually create the sockets that you make in the book but it really would be nice to use that HTTP Push API.</p>
<p>Pardon me if I presuppose some of the fundamentals incorrectly. Im a neophyte at both websockets and clustering. I don’t even know if clustering a number of nodes within a single digital ocean droplet will benefit me.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="266229" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/real-time-phoenix-pragprog/24808/136">Post #135</a>
	                </div>
	            </div>
              <div id="likers-container-266229" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="266229"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #135"></div>
  </section>
</div>
    <div class="postbit" id="266234" data-post-id="266234">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sb8244" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sb8244/120/18642_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sb8244
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Real-Time Phoenix</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="maz" data-post="136" data-topic="24808">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/maz/48/6075_2.png" class="avatar"> maz:</div>
<blockquote>
<p>that effectively feed into my “main” web app(the main web app is clustered along with them but has a Server role, as described in Real-time Phoenix)?</p>
</blockquote>
</aside>
<p>This is correct. They would be different clusters (not in same deployment) and would have no relationship other than the HTTP push API exposed by PushEx.</p>
<p>Your backend sends HTTP requests to /api/push. Your frontend connects to PushEx channels/topics and receives the data through it.</p>
<p>I highly recommend this deployment style if you are wanting things to work out-of-the-box.</p>
<aside class="quote no-group" data-username="maz" data-post="136" data-topic="24808">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/maz/48/6075_2.png" class="avatar"> maz:</div>
<blockquote>
<p>Pardon me if I presuppose some of the fundamentals incorrectly. Im a neophyte at both websockets and clustering. I don’t even know if clustering a number of nodes within a single digital ocean droplet will benefit me.</p>
</blockquote>
</aside>
<p>The biggest benefit of clustering is the resilience of the system. The most basic example is doing a rolling deployment. With a cluster, you can deploy one server, the next, etc. in a chain. In that case, your app would remain up and available. The users would receive a disconnection but it’s not the end of the world.</p>
<p>If you don’t have clustering and deploy to your one server, you will have guaranteed downtime. It’s worth stating that clustering for a WebSocket app like PushEx is a <em>must</em> if there are multiple servers. The Real-Time Phoenix book goes into this in the deployment section (ending chapters). If server A receives a push API call in its controller, it needs to <code>PubSub.broadcast</code> to other servers. That requires either direct clustering or Phoenix’s redis module that simulates clustering.</p>
<aside class="quote no-group" data-username="maz" data-post="136" data-topic="24808">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/maz/48/6075_2.png" class="avatar"> maz:</div>
<blockquote>
<p>I suppose I could not use Pushex at all and just manually create the sockets that you make in the book but it really would be nice to use that HTTP Push API.</p>
</blockquote>
</aside>
<p>The reason I built PushEx is because there’s a bit more to a production system than just the API setup. I made sure to include everything that we used at Salesloft (past employer that I built PushEx for) to give high resilience and operational insight.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="266234" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/real-time-phoenix-pragprog/24808/137">Post #136</a>
	                </div>
	            </div>
              <div id="likers-container-266234" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="266234"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #136"></div>
  </section>
</div>
    <div class="postbit" id="266236" data-post-id="266236">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="maz" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/maz/120/6075_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  maz
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="sb8244" data-post="137" data-topic="24808">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sb8244/48/18642_2.png" class="avatar"> sb8244:</div>
<blockquote>
<p>Your backend sends HTTP requests to /api/push. Your frontend connects to PushEx channels/topics and receives the data through it.</p>
</blockquote>
</aside>
<p>Aha thank you, this statement has really helped me materialize in my mind what sort of topology will be required to implement my app.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="266236" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/real-time-phoenix-pragprog/24808/138">Post #137</a>
	                </div>
	            </div>
              <div id="likers-container-266236" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="266236"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #137"></div>
  </section>
</div>
    <div class="postbit" id="274793" data-post-id="274793">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="maz" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/maz/120/6075_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  maz
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>In development, I’ve managed to implement a feature where if the user is authenticated, they can sync their data to other mobile devices via phoenix websockets. The backend architecture doesn’t use clustering(yet) but I’m wondering if I’m doing this in a long-term maintainable way. Currently I do:</p>
<ul>
<li>the server takes a REST call(which then enqueues on a GenStage queue)</li>
<li>the data is inserted on the GenStage queue</li>
<li>the event is broadcast on a Phoenix Channel, with the name <code>user:&lt;user-id&gt;</code> along with the json payload that was just inserted to the db. Any other devices connected via websocket will get the update and sync the data in their local embedded db</li>
</ul>
<p>Now that I have this POC, and I compare it to your design in Real-time Phoenix, am I doing this in the least maintainable way possible? Would it be better to:</p>
<ul>
<li>client connects via channel to “edge” node, and pushes the new data to the edge node via channel</li>
<li>that edge node is connected via libcluster/gossip with the “main”(db-hosting) server and broadcasts the insert</li>
<li>the main server then enqueues it onto GenStage</li>
<li>once it’s inserted to the db, the main server broadcasts the insert for the edge node to receive</li>
<li>the edge node pushes it to the connected clients</li>
</ul>
<p>Seeing it sync the way it is now it is very cool(and almost appears miraculous) but I don’t want to settle on a design that requires me a lot of downtime when I need to update the db schema down the line. I delayed clustering because I got bit by this OTP issue:</p>
<p><a href="https://github.com/bitwalker/libcluster/issues/184" class="onebox" target="_blank" rel="noopener nofollow ugc">https://github.com/bitwalker/libcluster/issues/184</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="274793" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/real-time-phoenix-pragprog/24808/139">Post #138</a>
	                </div>
	            </div>
              <div id="likers-container-274793" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="274793"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #138"></div>
  </section>
</div>
    <div class="postbit" id="274796" data-post-id="274796">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sb8244" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sb8244/120/18642_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sb8244
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Real-Time Phoenix</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="maz" data-post="139" data-topic="24808">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/maz/48/6075_2.png" class="avatar"> maz:</div>
<blockquote>
<p>Would it be better to:</p>
</blockquote>
</aside>
<p>One thing that I like about the first (simpler) design is that the time-to-db and hops-to-db is minimized.</p>
<p>In the proposed alternative, the data has to hop from client-&gt;edge-&gt;main before it’s persisted. In general, the more jumps there are, the more chances there are for something to go wrong.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="274796" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/real-time-phoenix-pragprog/24808/140">Post #139</a>
	                </div>
	            </div>
              <div id="likers-container-274796" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="274796"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #139"></div>
  </section>
</div>
    <div class="postbit" id="274797" data-post-id="274797">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="maz" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/maz/120/6075_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  maz
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Appreciate the feedback, found it heartening(and saved me from some ‘analysis paralysis’ – thank you.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="274797" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/real-time-phoenix-pragprog/24808/141">Post #140</a>
	                </div>
	            </div>
              <div id="likers-container-274797" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="274797"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #140"></div>
  </section>
</div>
    <div class="postbit" id="277872" data-post-id="277872">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="dub2" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dub2/120/27027_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  dub2
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/sb8244" rel="nofollow">@sb8244</a> - looking forward to reading. would you give a reading guide for 2023?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="277872" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/real-time-phoenix-pragprog/24808/142">Post #141</a>
	                </div>
	            </div>
              <div id="likers-container-277872" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="277872"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #141"></div>
  </section>
</div>
    <div class="postbit" id="277915" data-post-id="277915">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sb8244" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sb8244/120/18642_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sb8244
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Real-Time Phoenix</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Can you expand on your question? Do you mean a general reading guide of books relevant in 2023?</p>
<p>If so, most of what’s out there is still relevant. It depends a lot on what tech you want to use for your app (LiveView vs Absinthe/React for example). Pragmatic books on a specific topic have not disappointed me. But I also have been focused on starting a company so have been in a bubble.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="277915" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/real-time-phoenix-pragprog/24808/143">Post #142</a>
	                </div>
	            </div>
              <div id="likers-container-277915" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="277915"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #142"></div>
  </section>
</div>
    <div class="postbit" id="301369" data-post-id="301369">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="AstonJ" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/AstonJ/120/15_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  AstonJ
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Sorry all just catching up with things - there’s a Spotlight with <a class="mention" href="/u/sb8244" rel="nofollow">@sb8244</a> over on Devtalk, if you comment or ask a question you get a chance to win one of his books!</p>
<aside class="onebox discoursetopic" data-onebox-src="https://forum.devtalk.com/t/spotlight-stephen-bussey-author-interview-and-ama/120416">
  <header class="source">
      <img src="https://forum.devtalk.com/uploads/default/optimized/1X/dd5e3964010311d47a8d463fa690054615c9b28b_2_32x32.png" class="site-icon" alt="" width="32" height="32">

      <a href="https://forum.devtalk.com/t/spotlight-stephen-bussey-author-interview-and-ama/120416" target="_blank" rel="noopener nofollow" title="06:43PM - 14 August 2023">Devtalk – 14 Aug 23</a>
  </header>

  <article class="onebox-body">
    <img src="https://forum.devtalk.com/uploads/default/original/2X/d/d84890b6e292e1d4e270d11a7f903b62c3f709fb.jpeg" class="thumbnail onebox-avatar" width="240" height="240">

<div class="title-wrapper">
  <h3><a href="https://forum.devtalk.com/t/spotlight-stephen-bussey-author-interview-and-ama/120416" target="_blank" rel="noopener nofollow">Spotlight: Stephen Bussey (Author) Interview and AMA!</a></h3>
  <div class="topic-category">
      <span class="badge-wrapper bullet">
        <span class="badge-category-bg" style="background-color: #0;"></span>
        <span class="badge-category clear-badge">
          <span class="category-name">Community</span>
        </span>
      </span>
      <span class="badge-wrapper bullet">
        <span class="badge-category-bg" style="background-color: #0;"></span>
        <span class="badge-category clear-badge">
          <span class="category-name">In The Spotlight</span>
        </span>
      </span>
    <div class="topic-header-extra">
      <div class="list-tags">
        <div class="discourse-tags">
          <svg class="fa d-icon d-icon-tag svg-icon svg-string"><use href="#tag"></use></svg>
            <span class="discourse-tag simple">book-from-ruby-to-elixir</span>
            <span class="discourse-tag simple">ruby</span>
            <span class="discourse-tag simple">elixir</span>
            <span class="discourse-tag simple">languages</span>
            <span class="discourse-tag simple">stephen-bussey</span>
            <span class="discourse-tag simple">language-adoption</span>
            <span class="discourse-tag simple">functional-languages</span>
            <span class="discourse-tag simple">object-oriented-languages</span>
        </div>
      </div>
    </div>
  </div>
</div>

  <p>Author Spotlight:  Stephen Bussey  @sb8244   What’s better than a development language built so programmers will love it? Two languages built to enhance the joy of coding! We talked with Stephen Bussey, author of From Ruby to Elixir, about the...</p>

  <p>
    <span class="label1">Reading time: 16 mins 🕑</span>
      <span class="label2">Likes: 23 ❤</span>
  </p>

  </article>

  <div class="onebox-metadata">
    
    
  </div>

  <div style="clear: both"></div>
</aside>
 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="301369" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/real-time-phoenix-pragprog/24808/144">Post #143</a>
	                </div>
	            </div>
              <div id="likers-container-301369" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="301369"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>