<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>George Ball on foojay.io - Friends of OpenJDK</title><link>https://foojayio.github.io/website/today/author/george-ball/</link><description>Articles written by George Ball on foojay.io - Friends of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 02 Feb 2024 09:39:47 +0000</lastBuildDate><atom:link href="https://foojayio.github.io/website/today/author/george-ball/index.xml" rel="self" type="application/rss+xml"/><item><title>Achieving High Throughput Without Sacrificing Latency</title><link>https://foojayio.github.io/website/today/achieving-high-throughput-without-sacrificing-latency/</link><pubDate>Fri, 02 Feb 2024 09:39:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/achieving-high-throughput-without-sacrificing-latency/</guid><description>&lt;h2 id="h2-0-latency-and-throughput"&gt;Latency and Throughput&lt;/h2&gt;
&lt;p&gt;In discussions on performance, it is common to encounter the terms &lt;em&gt;Latency&lt;/em&gt; and &lt;em&gt;Throughput&lt;/em&gt; to describe the characteristics of a software component.&lt;/p&gt;
&lt;p&gt;We can define these terms as follows:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Latency&lt;/strong&gt; is a measure of the time taken for one thing to occur. For example, it could be the time taken to respond to a change in the price of a financial instrument that could influence the decision on whether to buy, or sell. It could be the time taken for a component monitoring some external device to respond to an indication of a change in the status of that device (like a change in temperature reported from a thermometer).&lt;/p&gt;</description></item><item><title>Strategies for Managing State in Chronicle Services</title><link>https://foojayio.github.io/website/today/strategies-for-managing-state-in-chronicle-services/</link><pubDate>Fri, 01 Dec 2023 08:41:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/strategies-for-managing-state-in-chronicle-services/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In distributed, microservice-based applications, the management of state is one of the most important, yet difficult aspects of design.&lt;/p&gt;
&lt;p&gt;Ensuring the accuracy and consistency of state without introducing excessive complexity that affects performance or flexibility to support evolving requirements requires careful thought.&lt;/p&gt;
&lt;p&gt;This article discusses issues around state management and shows how the &lt;a href="https://chronicle.software/services/" title="Chronicle Services" target="_blank" rel="noopener noreferrer"&gt;Chronicle Services&lt;/a&gt;
 framework provides support to deal with these in ways that maintain a resilient and high performing microservices architecture.&lt;/p&gt;</description></item><item><title>Navigating Behaviour with Events</title><link>https://foojayio.github.io/website/today/navigating-behaviour-with-events/</link><pubDate>Wed, 25 Oct 2023 15:04:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/navigating-behaviour-with-events/</guid><description>&lt;h2 id="h2-0-two-approaches"&gt;Two Approaches&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s little doubt that modern software architectures lean towards asynchronous models for communication between distributed components (where &amp;ldquo;distributed&amp;rdquo; means components that are not part of the same process, be they on the same or on different physical machines). Synchronous models such as Remote Procedure Call (RPC) are now largely discredited [&lt;a href="https://www.researchgate.net/profile/Ellen-Isaacs/publication/220168963_Why_do_users_like_video/links/02e7e5186b67219c70000000/Why-do-users-like-video.pdf#page=89" title="Waldo" target="_blank" rel="noopener noreferrer"&gt;Waldo&lt;/a&gt;
, &lt;a href="http://steve.vinoski.net/blog/2008/07/01/convenience-over-correctness/" title="Vinoski" target="_blank" rel="noopener noreferrer"&gt;Vinoski&lt;/a&gt;
]; even asynchronous variants of these are not seen as desirable.&lt;/p&gt;
&lt;p&gt;When we strip away the layers that present the illusion that RPC is really just the same as Local Procedure Call (i.e. a normal method invocation), we find sitting above the transport some form of messaging protocol. And these days, the APIs seem more willing to expose developers to these lower-level details, making it clear to programmers that communication with a remote component is inherently more complex than making a simple procedure call.&lt;/p&gt;</description></item><item><title>Chronicle Services: Building Fast Microservices with Java</title><link>https://foojayio.github.io/website/today/chronicle-services-building-fast-microservices-with-java/</link><pubDate>Wed, 13 Sep 2023 13:47:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/chronicle-services-building-fast-microservices-with-java/</guid><description>&lt;h3 id="h3-0-low-latency"&gt;Low Latency?&lt;/h3&gt;
&lt;p&gt;In computing, latency is defined as the length of time to perform some task. This could be the time it takes to respond to an interrupt from hardware or the time it takes for a message sent by one component to be available to its recipient.&lt;/p&gt;
&lt;p&gt;In many cases, latency is not seen as a primary non-functional concern when designing an application, even when considering performance. Most of the time, after all, computers seem to do their work at speeds that are well beyond human perception, typically using scales of milliseconds, microseconds, or even nanoseconds.&lt;/p&gt;</description></item><item><title>Billions of Messages Per Minute Over TCP/IP</title><link>https://foojayio.github.io/website/today/billions-of-messages-tcp-ip/</link><pubDate>Wed, 05 Jul 2023 21:05:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/billions-of-messages-tcp-ip/</guid><description>&lt;h3 id="h3-0-key-takeaways"&gt;Key Takeaways&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Data consistency is critical when communicating between software components on different machines to ensure information remains in tact.&lt;/li&gt;
&lt;li&gt;Low-latency data exchange requires a different approach than common formats.&lt;/li&gt;
&lt;li&gt;Chronicle&amp;rsquo;s open-source Wire library provides a highly efficient means of marshalling and unmarshalling data for transmission to and from Chronicle Queue.&lt;/li&gt;
&lt;li&gt;Recent additions to the library extend its use with TCP/IP communications channels, offering extremely high throughput.&lt;/li&gt;
&lt;li&gt;Using Wire across TCP/IP opens up the possibility of Cloud Native deployment of Chronicle-based applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-1-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;One of the most important issues when building distributed applications is that of data representation. We must ensure that data sent by a component to a &amp;ldquo;remote&amp;rdquo; component (i.e. one that is part of a different process) is received correctly, with the same values. This may seem straightforward but remember that the communicating components may have been written in completely different languages.&lt;/p&gt;</description></item><item><title>Tuning Java Applications for Low Latency on Linux</title><link>https://foojayio.github.io/website/today/tuning-java-applications-for-low-latency-on-linux/</link><pubDate>Wed, 10 May 2023 13:34:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/tuning-java-applications-for-low-latency-on-linux/</guid><description>&lt;h3 id="h3-0-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;I have lost count of the number of times I have been told that Java is not a suitable language in which to develop applications where performance is a major consideration. My first response is usually to ask for clarification on what is actually meant by &amp;ldquo;performance&amp;rdquo; as two of the most common measures &amp;ndash; throughput and latency, sometimes conflict with each other, and approaches to optimise for one may have a detrimental effect on the other.&lt;/p&gt;</description></item></channel></rss>