[{"content":"","date":"6 April 2026","externalUrl":null,"permalink":"/tags/azure/","section":"Tags","summary":"","title":"Azure","type":"tags"},{"content":"","date":"6 April 2026","externalUrl":null,"permalink":"/tags/cloud/","section":"Tags","summary":"","title":"Cloud","type":"tags"},{"content":"","date":"6 April 2026","externalUrl":null,"permalink":"/tags/devops/","section":"Tags","summary":"","title":"DevOps","type":"tags"},{"content":"","date":"6 April 2026","externalUrl":null,"permalink":"/tags/eda/","section":"Tags","summary":"","title":"Eda","type":"tags"},{"content":"Hi, I’m Kerman, a 26-year-old Cloud Engineer interested in technology and intentional living. I created this space to share the projects I’m working on, ideas about tech, and reflections on building a more focused and meaningful life. I’m curious about how technology shapes the way we think, work, and live. Outside of work, I enjoy keeping things simple. I like cooking, listening to Lo-Fi, traveling, and constantly learning something new.\nThis is where I document the process, not just the results.\nIf something resonates with you, feel free to reach out.\n","date":"6 April 2026","externalUrl":null,"permalink":"/","section":"Home","summary":"","title":"Home","type":"page"},{"content":"A collection of short writeups, longer essays, and project notes.\nExpect a mix of product thoughts, technical deep dives, and personal experiments.\n","date":"6 April 2026","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"6 April 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"This week I gave a talk at the Speaker Junior mentoring program about something I\u0026rsquo;ve been running into in real projects for a while: the exact moment when waiting for a synchronous response stops making sense. To make it concrete, I built a full demo on Azure. Real infrastructure, real code. This post walks through how it works and why the decisions matter.\nThe scenario is a simple order system. A client submits an order. Three things need to happen: Inventory reserves the stock, Billing charges the customer, Notification sends a confirmation. In a synchronous model, those three calls are chained one after another. The total response time is the sum of all three. If Billing takes five seconds and Notification two, the client waits seven seconds before getting a response. And that\u0026rsquo;s before anything goes wrong. If Billing throws an exception, the whole order fails and Notification never runs.\nThe async version flips this. The API receives the order, writes the initial state to Cosmos DB, publishes a single event to Azure Service Bus, and returns 202 Accepted in about 100 milliseconds. The client is done. The three services pick up the event independently, in parallel, each from its own subscription on the same topic.\nPortal → Order API publishes to Service Bus → three Functions consume in parallel → all patch Cosmos DB. The endpoint looks like this. Notice what it leaves out: no direct calls to Inventory, Billing, or Notification.\n@app.post(\u0026#34;/orders\u0026#34;, response_model=CreateOrderResponse, status_code=202) async def create_order(request: CreateOrderRequest): order_id = str(uuid.uuid4()) event_id = str(uuid.uuid4()) # Write initial state to Cosmos DB — source of truth for the portal await write_initial_state(order_id, request) # Publish one event — Service Bus fans it out to all three subscriptions event = OrderCreated(order_id=order_id, event_id=event_id, ...) await publish_order_created(event) # Return immediately — 202 means \u0026#34;accepted\u0026#34;, not \u0026#34;done\u0026#34; return CreateOrderResponse(order_id=order_id) The publishing side uses DefaultAzureCredential. No secrets in the code, it works with Managed Identity in production and az login locally. The correlation_id travels in application_properties of every Service Bus message, so you can filter the entire flow of a specific order in App Insights with a single query.\nmessage = ServiceBusMessage( body=json.dumps(event.to_dict()), content_type=\u0026#34;application/cloudevents+json\u0026#34;, application_properties={ \u0026#34;event_type\u0026#34;: event.event_type, \u0026#34;order_id\u0026#34;: event.order_id, \u0026#34;correlation_id\u0026#34;: event.event_id, # ties all three consumers together in logs }, message_id=event.event_id, # enables deduplication if activated on the namespace ) await sender.send_messages(message) Each consumer is an Azure Function v2 triggered by its own subscription. The Billing one looks like this:\n@app.service_bus_topic_trigger( arg_name=\u0026#34;msg\u0026#34;, topic_name=\u0026#34;orders\u0026#34;, subscription_name=\u0026#34;billing-sub\u0026#34;, connection=\u0026#34;AzureWebJobsServiceBus\u0026#34;, ) async def billing_function(msg: func.ServiceBusMessage) -\u0026gt; None: props = msg.application_properties or {} order_id = props.get(\u0026#34;order_id\u0026#34;, \u0026#34;unknown\u0026#34;) correlation_id = props.get(\u0026#34;correlation_id\u0026#34;, \u0026#34;unknown\u0026#34;) # Idempotency check — at-least-once delivery means duplicates are possible if await _check_already_processed(order_id, \u0026#34;billing\u0026#34;): return await _update_status(order_id, \u0026#34;billing\u0026#34;, \u0026#34;processing\u0026#34;) # ... process payment ... await _update_status(order_id, \u0026#34;billing\u0026#34;, \u0026#34;done\u0026#34;) The _update_status helper uses Cosmos DB\u0026rsquo;s patch_item. It only touches the /status/billing path in the document, so all three Functions can write their own status concurrently without stepping on each other.\nawait container.patch_item( item=order_id, partition_key=order_id, patch_operations=[ {\u0026#34;op\u0026#34;: \u0026#34;replace\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/status/billing\u0026#34;, \u0026#34;value\u0026#34;: status} ], ) For the second demo I wanted to show what happens when Billing fails. I added a force_billing_fail property to the message that the portal can toggle on and off. When it\u0026rsquo;s true, the Function raises an exception on purpose. Service Bus retries three times, then moves the message to the Dead Letter Queue. Inventory and Notification are completely unaffected. They consumed their own copies of the event from their own subscriptions and finished fine. The order isn\u0026rsquo;t lost. Fix the issue, requeue from the DLQ, and Billing processes correctly.\nThat last bit is the hardest to internalize without seeing it live. A failure in one consumer doesn\u0026rsquo;t cascade. The message sits in the DLQ waiting. In a synchronous chain, a failure at step two means step three never runs and the client gets a 500. Here, the client already got a 202 and two out of three things worked fine.\nThe full infrastructure is Terraform — Service Bus namespace, topic with three subscriptions, three Function Apps, Cosmos DB, and App Insights all wired together. Everything is in the repo if you want to read the actual code: Kerman-Sanjuan/event-driven-acl.\n","date":"6 April 2026","externalUrl":null,"permalink":"/posts/cuando-esperar-una-respuesta-deja-de-ser-buena-idea/","section":"Posts","summary":"","title":"when waiting for an answer stops being a good idea","type":"posts"},{"content":"","date":"12 March 2026","externalUrl":null,"permalink":"/tags/reflections/","section":"Tags","summary":"","title":"Reflections","type":"tags"},{"content":"Last week, I had one of those conversations that stays with you for days. I was driving home with one of my closest friends, and we started talking deeply about life, goals, and the pressure we put on ourselves. What surprised me was this: even though we see the world in very different ways and we are walking very different paths, we still landed on the same feeling. We both want to achieve something meaningful, and we both know what it feels like to get in our own way.\nAfter reflecting on that conversation, I decided to call this problem \u0026ldquo;the vicious circle of self-deception.\u0026rdquo; For me, it works like this: when you are ambitious, you naturally chase growth, challenge, and progress. You set high standards. You want to do great work. But then reality hits. Some days you are tired. Some days your mind is noisy. Some days you simply do not have the same energy. Or simply, don\u0026rsquo;t now how to reach the destination.\nAnd instead of accepting that as part of being human, you start judging yourself. You tell yourself you are falling behind. You compare what you did today with the perfect version of yourself you imagine in your head. That gap creates frustration. Frustration turns into guilt. Guilt quietly turns into self-deception, because deep down you know what matters to you, but your actions are not matching it. As I said in my previous post, when purpose and action are not aligned, struggle shows up.\nAs people say, every problem comes with a possible solution. In my case, these last few days were less about finding a perfect system and more about finding an honest one. I realized the core issue is not \u0026ldquo;being tired\u0026rdquo; or \u0026ldquo;being lazy.\u0026rdquo; Those are normal human states. Trying to eliminate them completely is impossible and, honestly, exhausting.\nWhat is actually under my control is my response to those days. Not my mood. Not my energy level. My response.\nWhat works for me is simple: do something small, especially when things are not going as planned. On those long, uninspired days, I lower the bar but I do not disappear. I write one paragraph. I read a few pages. I test one idea. I learn one small thing. I move, even if it is slow.\nThat tiny action does two important things. First, it protects momentum. Second, it protects identity. I am still someone who shows up. And over time, that matters more than any heroic burst of productivity.\nThere is no need to force yourself into \u0026ldquo;work 15 hours a day\u0026rdquo; mode. That usually destroys motivation and makes everything feel impossible. Consistency built on realism beats intensity built on pressure.\nSo this is the reminder I am leaving here for myself, and maybe for you too: it is better to take one step every day than to run a mile once a month.\nThanks to my friend for allowing myself to have such a deep and meaningfull conversations. Let\u0026rsquo;s keep going.\n","date":"12 March 2026","externalUrl":null,"permalink":"/posts/vicious-cycle-of-deception/","section":"Posts","summary":"","title":"the vicious circle of self-deception","type":"posts"},{"content":"Lately I\u0026rsquo;ve been thinking about my future goals and how I want to evolve during my career. For some reason, and not by coincidence, I\u0026rsquo;ve been dealing with the well-known \u0026ldquo;impostor syndrome.\u0026rdquo; I feel like I\u0026rsquo;m not good enough, that I don\u0026rsquo;t deserve the things I\u0026rsquo;ve achieved. This is a common feeling among high-achievers, and it\u0026rsquo;s something that I\u0026rsquo;ve been struggling with for a while.\nThe AI does not help, to be honest. Being able to use it in almost every context has made me feel that the knowledge I\u0026rsquo;ve built over the years is not as valuable as it used to be. I feel like I\u0026rsquo;m not learning anything new, and that I\u0026rsquo;m just repeating the same things over and over again. This is a dangerous mindset, and it\u0026rsquo;s something that I need to overcome. In the same way, I discovered that I\u0026rsquo;ve been relying on AI even for the simplest, most trivial tasks, even for simple decision-making. That made me realize the dependency I\u0026rsquo;ve created and how it\u0026rsquo;s affecting my ability to think critically and make decisions on my own. I need to find a balance between using AI as a tool to enhance my capabilities and not letting it take over my thinking process.\nThere’s a YouTube channel I’ve followed for a couple of years, jvscholz. His videos are not about minimalism or the simple life, but for some reason, his way of expressing himself and the way he lives has made me think about the meaning of it. I don\u0026rsquo;t want to be a minimalist, but I do want to simplify my life. I want to focus on the things that are important to me and let go of the things that are not. I want to align my purpose with my actions and not let the fear of missing out or the need for validation from others dictate my choices.\nBut which purpose? That\u0026rsquo;s something I\u0026rsquo;m figuring out. For example, I\u0026rsquo;ve always wanted to have some kind of webpage for myself, where I can share my thoughts and ideas with the world. But I never took the time to do it, because I was afraid of what others would think, or because I didn\u0026rsquo;t know where to start, or even worse, looking for the most efficient framework, programming language, or hosting service (well-known paralysis by analysis). But now, I\u0026rsquo;m trying to overcome that fear and the need for perfection and calculation, and just start doing it. I want to share my thoughts and ideas with the world and see where it takes me.\nI don\u0026rsquo;t know, maybe it has to do with the fact that now I live on my own, and I have to take care of myself and the ones I care about. Maybe it\u0026rsquo;s just a phase, but I feel like I\u0026rsquo;m in a transition period, and I\u0026rsquo;m trying to figure out who I am and what I want to do with my life. I\u0026rsquo;m not sure if this is a good thing or a bad thing, but I\u0026rsquo;m trying to embrace it and see where it takes me.\n","date":"19 February 2026","externalUrl":null,"permalink":"/posts/aligning-purpose-with-actions/","section":"Posts","summary":"Hi to you all","title":"aligning purpose with actions","type":"posts"},{"content":"","date":"10 February 2026","externalUrl":null,"permalink":"/articles/","section":"Articles","summary":"","title":"Articles","type":"articles"},{"content":"","externalUrl":null,"permalink":"/posts/who-do-you-want-to-impress/","section":"Posts","summary":"","title":"","type":"posts"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","externalUrl":null,"permalink":"/tags/containers/","section":"Tags","summary":"","title":"Containers","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/docker/","section":"Tags","summary":"","title":"Docker","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/kubernetes/","section":"Tags","summary":"","title":"Kubernetes","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/platform/","section":"Tags","summary":"","title":"Platform","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/security/","section":"Tags","summary":"","title":"Security","type":"tags"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]