<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Milos Zivkovic on Medium]]></title>
        <description><![CDATA[Stories by Milos Zivkovic on Medium]]></description>
        <link>https://medium.com/@zivce?source=rss-3ee57b082bb------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*421m4FcEmm2KBeiI-JT_yw.jpeg</url>
            <title>Stories by Milos Zivkovic on Medium</title>
            <link>https://medium.com/@zivce?source=rss-3ee57b082bb------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 10 Nov 2026 16:48:53 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@zivce/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Tips for a better developer experience with Temporal]]></title>
            <link>https://medium.com/symphonyis/tips-for-a-better-developer-experience-with-temporal-9b2205ee0563?source=rss-3ee57b082bb------2</link>
            <guid isPermaLink="false">https://medium.com/p/9b2205ee0563</guid>
            <category><![CDATA[development]]></category>
            <category><![CDATA[temporal]]></category>
            <dc:creator><![CDATA[Milos Zivkovic]]></dc:creator>
            <pubDate>Mon, 22 Jul 2024 14:56:57 GMT</pubDate>
            <atom:updated>2024-07-22T14:56:57.969Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*smQbt4hkqilz8bLTiHtKmA.png" /></figure><p>Temporal is a reliable runtime for polyglot, durable, and fault-tolerant applications. Its workflows, activities, schedules, and other abstractions do the heavy lifting, allowing you to focus on business code.</p><p>The gist of the story won’t be about how Temporal works; for a high-level overview, go here: <a href="https://temporal.io/how-it-works"><em>How it Works | Temporal Technologies</em></a><em>.</em></p><p>Temporal offers the critical benefits of resilience, durability, and observability, which are essential for projects. Aside from these benefits, Temporal is developer-friendly from the start. However, despite being developer-friendly, there are still pitfalls to avoid.</p><p>Here are some good tips for navigating Temporal pitfalls, leveraging its benefits, and easing development.</p><h3>Create custom data transfer objects</h3><p>Data sent through each activity needs to be serialized and deserialized. Hence, these objects should be lightweight and serializable. Avoid using big objects, as they can lead to errors.</p><p>Activities communicate back and forth with the Temporal server. Arguments flowing into activities need to be deserialized, and responses coming back from activities need to be serialized.</p><p>If you don’t avoid this bad practice, you’ll encounter this issue: “Complete result exceeds size limit.” You can find the causes of this error on the Temporal Community support <a href="https://community.temporal.io/t/find-cause-of-complete-result-exceeds-size-limit-error/457">pages</a>.</p><p>The solution: store blobs instead of using them as activity payloads.</p><p>Activity and workflow payloads should be as small as possible. It’s always better to return IDs rather than full-blown entity objects from activities. This way, we avoid serialization/deserialization overhead.</p><h3>Wrap activity arguments into a single object</h3><p>Activities and workflows are simple methods, meaning you can pass them an arbitrary number of arguments. However, if you don’t use a wrapper for arguments, this will break backward compatibility as activities evolve. When there’s one wrapper, you can easily change the data without changing the method arguments arity.</p><p>This approach is preferred:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*rGGzKEFd-zD_BC10" /></figure><p>Compared to this approach:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*VpwqBlGSAccUzUIF" /></figure><p>This adds a bit of boilerplate, but the future benefits amortize it in the long run. While working with wrapped arguments, make sure they are serializable. All activity response and request properties need to be serializable.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8vCtC_Mvj8pm7DW0" /></figure><p>Retrying the above activity would execute each of the activity’s code lines multiple times, which could result in charging the customer multiple times. Breaking each line into a separate activity method will resolve the returnable issues. If indefinite retries are enabled per activity, the activity will retry until it succeeds or a non-retryable error occurs. This enables durable execution and appropriate action during execution. If the issue is resolved (the payment processor issue is resolved, and the charge is completed), the workflow is completed without intervention from customer support. This is especially helpful during down-time of a third-party service or when dealing with flaky services, as no failure occurs on the Temporal’s end at all.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*nR4lykG7f1pvbepR" /></figure><p>It’s not so hard to notice the boilerplate. One must notice the boilerplate that becomes unmanageable at this point. This is one downside of the Temporal Java SDK. As you add more workflows and activities, you’ll encounter more boilerplate.</p><p>Another downside is that each activity needs to be created as a new stub in each workflow. For example, this code:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*BWBCF56TZMsDEwuW" /></figure><p>Needs to be duplicated in every workflow that uses this activity.</p><p>Using Temporal judiciously will help reduce boilerplate.</p><h3>Create custom search attributes to ease workflow filtering</h3><p>Custom search attributes make the UI more digestible when you have many workflows. For example, a Temporal server could have this order of workflows in a development environment.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*WxqU0Yt3mNjVX5Xq" /></figure><p>Default search attributes can help filter this number down. Here are some; the most helpful is ExecutionStatus.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/166/1*_w0u4BQyVAv7wH-NtmTqGQ.png" /></figure><p>One custom search attribute that you could have is the ability to search by part of the workflow ID.</p><p>The default search attribute, workflowID, requires you to supply the full workflow ID in the query and doesn’t support partial search.</p><p>This is useful as you will most likely encode some identifiers within the workflow ID.</p><p>How to define custom search attributes?</p><p>Let’s say we want to create a partial workflow ID search attribute. Here’s the code to register the custom search attribute PartialWorfklowId on the Temporal service.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*HGbSVHdsBiL5aUOg" /></figure><p>In the above example, the entire text is searchable by word. Other types can be used as index fields.</p><h3>Closing words</h3><p>In addition to these tips, Temporal provides many project samples to minimize the learning curve and improve developer experience.</p><p>The samples are available in all widely used languages (Java, Go, .NET), making it easy to learn and quickly prototype.</p><p>For Java developers, official Temporal server configuration support exists. You can use <a href="https://github.com/temporalio/sdk-java/tree/master/temporal-spring-boot-autoconfigure-alpha"><em>spring-boot-autoconfigure-alpha</em></a> for Spring Boot projects. This library configures you so you don’t have to register workflows and activities yourself.</p><p>Here is the code to register workflows from a single package automatically:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*gCTV0gc_sdxi0DLo" /></figure><p>All you need to do is annotate the relevant workflows and assign them to task queues.</p><p>Developer support, polyglot and developer-friendly guides, and easy setup make Temporal a strong contender for any developer’s toolkit.</p><h3>About author</h3><p>Milos Zivkovic, an experienced Java Software Engineer from our Nis Branch at Symphony, has a background in integrating and developing secure, efficient, and scalable systems using Spring Boot, Temporal, and other modern technologies. He has worked on custom payment flows, custom authentication flows, and custom CI/CD pipelines. Milos aims to consistently deliver high-quality, business-aligned solutions while effectively communicating and implementing meaningful code improvements.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9b2205ee0563" width="1" height="1" alt=""><hr><p><a href="https://medium.com/symphonyis/tips-for-a-better-developer-experience-with-temporal-9b2205ee0563">Tips for a better developer experience with Temporal</a> was originally published in <a href="https://medium.com/symphonyis">symphonyis</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Is Your Keycloak Not Working behind Nginx Ingress Controller? Here’s How to Fix the Issues]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/is-your-keycloak-not-working-behind-nginx-ingress-controller-heres-how-to-fix-the-issues-12557d76d24d?source=rss-3ee57b082bb------2"><img src="https://cdn-images-1.medium.com/max/889/1*oAi9U4ULeGp2fZEXVKZr9Q.png" width="889"></a></p><p class="medium-feed-snippet">Deploying Keycloak to GKE in high availability and solving incoming issues</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/is-your-keycloak-not-working-behind-nginx-ingress-controller-heres-how-to-fix-the-issues-12557d76d24d?source=rss-3ee57b082bb------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/is-your-keycloak-not-working-behind-nginx-ingress-controller-heres-how-to-fix-the-issues-12557d76d24d?source=rss-3ee57b082bb------2</link>
            <guid isPermaLink="false">https://medium.com/p/12557d76d24d</guid>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[keycloak]]></category>
            <category><![CDATA[google-kubernetes-engine]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <dc:creator><![CDATA[Milos Zivkovic]]></dc:creator>
            <pubDate>Sun, 28 Jan 2024 20:24:13 GMT</pubDate>
            <atom:updated>2024-01-28T20:24:13.643Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Why Experienced Java Developers are Immune to Layoffs]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/why-experienced-java-developers-are-immune-to-layoffs-2370a772a47f?source=rss-3ee57b082bb------2"><img src="https://cdn-images-1.medium.com/max/2600/1*Wb13JitIv2tvztAoW9HehA.jpeg" width="5737"></a></p><p class="medium-feed-snippet">What keeps us Java developers floating among layoffs</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/why-experienced-java-developers-are-immune-to-layoffs-2370a772a47f?source=rss-3ee57b082bb------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/why-experienced-java-developers-are-immune-to-layoffs-2370a772a47f?source=rss-3ee57b082bb------2</link>
            <guid isPermaLink="false">https://medium.com/p/2370a772a47f</guid>
            <category><![CDATA[java]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[java8]]></category>
            <dc:creator><![CDATA[Milos Zivkovic]]></dc:creator>
            <pubDate>Sun, 14 Jan 2024 17:20:54 GMT</pubDate>
            <atom:updated>2024-01-14T17:20:54.467Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[2 Easier Alternatives to NGINX Developers Can Use to Deploy Keycloak Behind a Reverse Proxy]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/codex/2-easier-alternatives-to-nginx-developers-can-use-to-deploy-keycloak-behind-a-reverse-proxy-9513a67996b9?source=rss-3ee57b082bb------2"><img src="https://cdn-images-1.medium.com/max/2600/1*o8kROLbfyzjbwZBt7MVF4w.jpeg" width="4000"></a></p><p class="medium-feed-snippet">Easier alternatives to overcome NGINX complexity with Keycloak</p><p class="medium-feed-link"><a href="https://medium.com/codex/2-easier-alternatives-to-nginx-developers-can-use-to-deploy-keycloak-behind-a-reverse-proxy-9513a67996b9?source=rss-3ee57b082bb------2">Continue reading on CodeX »</a></p></div>]]></description>
            <link>https://medium.com/codex/2-easier-alternatives-to-nginx-developers-can-use-to-deploy-keycloak-behind-a-reverse-proxy-9513a67996b9?source=rss-3ee57b082bb------2</link>
            <guid isPermaLink="false">https://medium.com/p/9513a67996b9</guid>
            <category><![CDATA[oauth]]></category>
            <category><![CDATA[keycloak]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[reverse-proxy]]></category>
            <category><![CDATA[nginx]]></category>
            <dc:creator><![CDATA[Milos Zivkovic]]></dc:creator>
            <pubDate>Sat, 09 Dec 2023 14:19:58 GMT</pubDate>
            <atom:updated>2023-12-09T14:19:58.158Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How to Convince Anyone on the Need to Upgrade from Java 8]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/codex/how-to-convince-anyone-on-the-need-to-upgrade-from-java-8-4d70dc3e1d24?source=rss-3ee57b082bb------2"><img src="https://cdn-images-1.medium.com/max/1800/1*GKZgIW4a1ut7LVgA9wk96A.jpeg" width="1800"></a></p><p class="medium-feed-snippet">How latest Java does the right job with Strings, and how to use this as an advantage in negotiations</p><p class="medium-feed-link"><a href="https://medium.com/codex/how-to-convince-anyone-on-the-need-to-upgrade-from-java-8-4d70dc3e1d24?source=rss-3ee57b082bb------2">Continue reading on CodeX »</a></p></div>]]></description>
            <link>https://medium.com/codex/how-to-convince-anyone-on-the-need-to-upgrade-from-java-8-4d70dc3e1d24?source=rss-3ee57b082bb------2</link>
            <guid isPermaLink="false">https://medium.com/p/4d70dc3e1d24</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[java8]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[microservices]]></category>
            <dc:creator><![CDATA[Milos Zivkovic]]></dc:creator>
            <pubDate>Sun, 03 Dec 2023 21:10:52 GMT</pubDate>
            <atom:updated>2023-12-03T21:10:52.977Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[From Pay Cut to Seniority: My 2-Year Journey as an Experienced Developer]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/from-pay-cut-to-seniority-my-2-year-journey-as-an-experienced-developer-e8ec8c3fe509?source=rss-3ee57b082bb------2"><img src="https://cdn-images-1.medium.com/max/1408/1*ZxhH18lz5CdSEGUvtt4B6g.jpeg" width="1408"></a></p><p class="medium-feed-snippet">Why you should consider taking a pay cut as an experienced developer? Here&#x2019;s how the pay cut helped me improve.</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/from-pay-cut-to-seniority-my-2-year-journey-as-an-experienced-developer-e8ec8c3fe509?source=rss-3ee57b082bb------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/from-pay-cut-to-seniority-my-2-year-journey-as-an-experienced-developer-e8ec8c3fe509?source=rss-3ee57b082bb------2</link>
            <guid isPermaLink="false">https://medium.com/p/e8ec8c3fe509</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[work]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[salary]]></category>
            <category><![CDATA[workplace]]></category>
            <dc:creator><![CDATA[Milos Zivkovic]]></dc:creator>
            <pubDate>Tue, 21 Nov 2023 16:16:47 GMT</pubDate>
            <atom:updated>2023-11-21T16:16:47.771Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How to Setup Keycloak with Spring Boot without Keycloak Adapter]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/codex/how-to-setup-keycloak-with-spring-boot-without-keycloak-adapter-dd609a28de3c?source=rss-3ee57b082bb------2"><img src="https://cdn-images-1.medium.com/max/2600/1*uYzhgEJ6ridDrlKbSj2tPg.jpeg" width="5000"></a></p><p class="medium-feed-snippet">Here&#x2019;s the solution to what most clients and developers struggle with Keycloak and Spring Boot</p><p class="medium-feed-link"><a href="https://medium.com/codex/how-to-setup-keycloak-with-spring-boot-without-keycloak-adapter-dd609a28de3c?source=rss-3ee57b082bb------2">Continue reading on CodeX »</a></p></div>]]></description>
            <link>https://medium.com/codex/how-to-setup-keycloak-with-spring-boot-without-keycloak-adapter-dd609a28de3c?source=rss-3ee57b082bb------2</link>
            <guid isPermaLink="false">https://medium.com/p/dd609a28de3c</guid>
            <category><![CDATA[spring-boot]]></category>
            <category><![CDATA[keycloak]]></category>
            <category><![CDATA[openid-connect]]></category>
            <category><![CDATA[oauth2]]></category>
            <category><![CDATA[security]]></category>
            <dc:creator><![CDATA[Milos Zivkovic]]></dc:creator>
            <pubDate>Sat, 18 Nov 2023 18:23:17 GMT</pubDate>
            <atom:updated>2023-11-18T18:23:17.588Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How to Leverage Upwork’s Potential as a Full-Time Software Developer]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/codex/how-to-leverage-upworks-potential-for-full-time-software-developers-c138559d25a0?source=rss-3ee57b082bb------2"><img src="https://cdn-images-1.medium.com/max/2600/1*8ZxgAwprynOAY3f--rvYUg.jpeg" width="3895"></a></p><p class="medium-feed-snippet">A story on how Upwork can bump your developer rank up</p><p class="medium-feed-link"><a href="https://medium.com/codex/how-to-leverage-upworks-potential-for-full-time-software-developers-c138559d25a0?source=rss-3ee57b082bb------2">Continue reading on CodeX »</a></p></div>]]></description>
            <link>https://medium.com/codex/how-to-leverage-upworks-potential-for-full-time-software-developers-c138559d25a0?source=rss-3ee57b082bb------2</link>
            <guid isPermaLink="false">https://medium.com/p/c138559d25a0</guid>
            <category><![CDATA[work]]></category>
            <category><![CDATA[freelancing]]></category>
            <category><![CDATA[upwork]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Milos Zivkovic]]></dc:creator>
            <pubDate>Sun, 08 Oct 2023 21:09:48 GMT</pubDate>
            <atom:updated>2023-10-11T07:46:06.757Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Seasoned Developers, Use These Strategies to Avoid Impulsive Decisions]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/codex/seasoned-developers-use-these-strategies-to-avoid-impulsive-decisions-e9cb1dc35140?source=rss-3ee57b082bb------2"><img src="https://cdn-images-1.medium.com/max/2600/1*1F2Or3CYwjET7xJYKxAOfA.jpeg" width="3627"></a></p><p class="medium-feed-snippet">&#x201C;Whoa there, Milos! Let&#x2019;s not break prod with your code.&#x201D;</p><p class="medium-feed-link"><a href="https://medium.com/codex/seasoned-developers-use-these-strategies-to-avoid-impulsive-decisions-e9cb1dc35140?source=rss-3ee57b082bb------2">Continue reading on CodeX »</a></p></div>]]></description>
            <link>https://medium.com/codex/seasoned-developers-use-these-strategies-to-avoid-impulsive-decisions-e9cb1dc35140?source=rss-3ee57b082bb------2</link>
            <guid isPermaLink="false">https://medium.com/p/e9cb1dc35140</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[agile-development]]></category>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[work]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Milos Zivkovic]]></dc:creator>
            <pubDate>Sat, 07 Oct 2023 14:44:46 GMT</pubDate>
            <atom:updated>2023-10-07T14:44:46.645Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How to Be a -20X Engineer]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/codex/how-to-be-a-20x-engineer-510d83d1c041?source=rss-3ee57b082bb------2"><img src="https://cdn-images-1.medium.com/max/2600/1*HyWtDGSIyP4TyxvBgunoyQ.jpeg" width="3072"></a></p><p class="medium-feed-snippet">Inspired by the taylor. town&apos;s story on -10x engineers</p><p class="medium-feed-link"><a href="https://medium.com/codex/how-to-be-a-20x-engineer-510d83d1c041?source=rss-3ee57b082bb------2">Continue reading on CodeX »</a></p></div>]]></description>
            <link>https://medium.com/codex/how-to-be-a-20x-engineer-510d83d1c041?source=rss-3ee57b082bb------2</link>
            <guid isPermaLink="false">https://medium.com/p/510d83d1c041</guid>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Milos Zivkovic]]></dc:creator>
            <pubDate>Tue, 26 Sep 2023 10:22:18 GMT</pubDate>
            <atom:updated>2023-09-26T10:22:18.139Z</atom:updated>
        </item>
    </channel>
</rss>