State of Routing in Model Serving

Post Syndicated from Netflix Technology Blog original https://netflixtechblog.com/state-of-routing-in-model-serving-16e22fe18741

By Nipun Kumar, Rajat Shah, Peter Chng

Introduction

This is the first blog post in a multi-part series that shares technical insights into how our ML model serving infrastructure powers several personalized experiences at scale across various domains (e.g., title recommendations, commerce). In this introductory blog post, we will dive into our domain-independent API abstraction and its traffic routing capabilities that the central ML model serving platform exposes to several domain-specific microservices for model inference. This singular API, or entry point, into the ML model serving platform has significantly increased the speed of innovation for iterating on newer versions of existing ML experiences, as well as enabling completely new product experiences with ML.

Machine Learning use cases powering member experiences on Netflix require rapid iteration and evolution in response to new learnings. The success of our ML model serving infrastructure largely depends on enabling researchers to rapidly experiment with new hypotheses and safely, at scale, release their models into production. Equally important is enabling multiple microservices at Netflix to seamlessly get model inference without exposing the complexities of ML model inference. To achieve this in a uniform and scalable manner, we created a centralized ML serving platform. As of 2025, the platform serves hundreds of model types and versions, netting 1 million requests per second. In this post, we’ll zoom in on a core challenge of any large-scale ML serving system: How to route traffic to the right model instance, on the right cluster shard, for the right user and use case, while preserving a simple abstraction for both client services and model researchers.

Background

Models at Netflix

To properly frame our discussion, let’s first clarify the distinction between model serving and model inference. At Netflix, the definition of an ML model has historically been somewhat unique. While model inference typically focuses only on an infer(features) -> score capability, models at Netflix act as self-contained workflows that transform inputs to outputs. A “model” encapsulates pre- and post-processing, feature computation logic, and an optional ML-trained component, all packaged in a standard format suitable for use across multiple contexts. We refer to the end-to-end execution of this workflow as model serving. This distinction matters because our routing and API abstractions operate at the level of workflows, not just individual scoring functions.

A few simplified examples of model serving use cases:

Use case: Personalized Continue Watching row on Netflix Homepage

  • Input: UserId, Country, Device ID
  • Output: Ranked List of movies and shows (aka title): [titleId1, titleId2, titleId3,…]

Use case: Payment Fraud Detection

  • Input: UserId, Country, Payment Transaction details
  • Output: Probability of the transaction being fraudulent

A typical flow of this serving workflow is depicted below:

To achieve this higher level of abstraction, the model definition contains a list of facts (raw, unprocessed data or observations built as states in different business workflows) that it needs to compute features, and it relies on the model serving platform to supply these facts at serving time by calling several other microservices. Likewise, during offline training, Netflix’s ML fact store provides snapshots for bulk access to facilitate feature computation.

The important takeaway from this model definition is that the calling services only need to provide standard request context (such as userId, country, device), and the relevant domain context (such as titles to rank, or payment transaction for fraud detection), and the model can itself compute features and perform inference as part of the execution flow. This common set of request contexts across domains enables them to share a standard API abstraction and standardizes how various client microservices can uniformly integrate with the serving app. Furthermore, clients are shielded from the model selection and execution, allowing the model architecture and data inputs to evolve with minimal client coordination.

This post focuses on showcasing the technical details to support this design paradigm. We’ll first describe how we implemented this abstraction with Switchboard, a centralized routing service, and then discuss the operational challenges we encountered at scale and how they led us to the Lightbulb architecture.

ML Model Serving Platform Principles

We envisioned a central model serving platform for all of Netflix’s member-facing ML Model serving needs. This ambitious effort required principled thinking to provide the right level of abstraction for both the researchers and client applications. The following ideas, which are relevant to the topic of this blog post, ensured that the platform acts as an enabler of rapid ML innovation and limits the exposure of ML model iterations to the client apps:

  • Model innovation independent of client apps: There should be only a one-time integration effort by the calling app with the ML serving platform for a new use case. After that, almost all model iterations, including intermediate model A/B experiments, should be mostly opaque to the calling apps. This implies that the platform should handle tasks such as model selection based on a user’s A/B allocation, fetching additional data needed by experimental models, logging for further training or observability, and more. This also benefits the ML researcher, as they only need to coordinate with one platform for model innovation.
  • Decouple clients from model sharding: Models are distributed across multiple serving compute cluster shards, each with its own Virtual IP (VIP) Address. Various factors, such as traffic patterns, SLAs, model architecture, and CPU/Memory availability, affect model-to-cluster mapping, and changes to this mapping result in changes to the VIP address at which a model is reachable. The serving platform should make clients agnostic to such frequent VIP address changes while ensuring high availability.
  • Flexible traffic routing rules: Support flexible mechanisms to introduce new traffic routing rules. This includes supporting traffic routing based on A/B experiments, providing a knob to slowly shift traffic to new models and VIP addresses, and allowing client overrides.

Introducing Switchboard

Standard out-of-the-box API Gateway solutions (such as AWS API Gateway, a standalone Service Mesh proxy) did not meet all our requirements. In particular, we needed first-class integration with Netflix’s experimentation platform, the ability to expose gRPC endpoints to clients, and the ability to use rich domain-specific context for routing customizations, which generic proxies were not designed to handle. Furthermore, the platform required customizations to model-specific lifecycle stages (shadow mode, canaries, rollbacks) to enable safe rollouts and migrations.

Hence, we embarked on building a custom service that serves as a flexible proxy layer for all traffic, handling over 1 million requests per second while maintaining high availability and reliability. We named it Switchboard.

Switchboard serves as the central entry point for the system, acting as a mandatory interface for all clients to access the appropriate model based on their context. Its role is to perform context-aware routing and to apply any configured context enrichment to the model inputs.

Here is a visual representation of the request flow from different clients to different serving clusters:

Objective Abstraction

To support this system design, we introduce the concept of an “Objective”. It’s an Enumeration defined by the serving platform that every request into the system must provide. It has three key purposes:

In short, an Objective is the serving platform’s name for a specific business use case (e.g., ContinueWatchingRanking), which decouples clients from concrete models and guides the platform’s routing and model selection decisions.

Key Capabilities of Switchboard

To summarize, these are the key capabilities of Switchboard:

  1. Common Client Abstraction: Switchboard provides a single point of contact for all our clients’ model needs. When clients wish to consume additional models for new ML applications addressing the same business need, there is no new service dependency to introduce or new clients to manage to make requests to the models. From an ML Ops perspective, this also gives us knobs to control client rate limits across model versions and manage central concurrency limits to deal with bad clients.
  2. Context-Aware Routing: Switchboard can route a request based on a rich set of contextual features, such as the user’s current device, locale, ranking surface type (e.g., home page vs. search results), or the current A/B test a user is in.
  3. Dynamic Traffic Splitting: It enables real-time traffic splitting for canary deployments and experimentation. This allows engineers to safely roll out a new model version to a small, controlled percentage of users before a full launch.
  4. Model Versioning and Lifecycle Management: Switchboard inherently manages concurrent request traffic to multiple versions of the same model. This is crucial for:
  • Shadow Mode Testing: Routing production traffic to a new model version without affecting the user experience, enabling performance comparisons.
  • Instant Rollback: Immediate switching of traffic away from a problematic new model version back to a stable one.

But is this the whole story? Not quite. Introducing this routing layer adds complexity to our model deployment cycles. In addition, we need a mechanism to collect the context-based routing information from the researchers when they choose to deploy model variants.

The Glue — Switchboard Rules

Given that Objectives serve as the contract between clients and the serving platform, we needed a way for researchers to attach model variants, experiments, and traffic splits to those Objectives without changing client code. This is where Switchboard Rules comes in.

The primary UX for model researchers to define models associated with an objective in a flexible manner is a JavaScript configuration, which we call Switchboard Rules. It’s used to produce a set of rules (typically a JSON file) that primarily dictate the following things to the serving platform:

  1. The default model to use for a given Objective
  2. A/B experiments to configure for a set of Objectives and the corresponding models to load for those experiments
  3. Customizations to gradually shift traffic to a new model

Here is an example of an A/B test rule in the context of the Continue Watching row:

/**
Configuration rule written by a Model Researcher to add an A/B experiment in the Model Serving system.
Cell 1: Uses the default, currently productized model
Cell 2 and Cell 3: Use different experimental (candidate) models
**/

function defineAB12345Rule() {
const abTestId = 12345;

const objectives = Objectives.ContinueWatchingRanking;
const abTestCellToModel = {
1: {name: "netflix-continue-watching-model-default"},
2: {name: "netflix-continue-watching-model-cell-2"},
3: {name: "netflix-continue-watching-model-cell-3"}
};

return {
cellToModel: abTestCellToModel,
abTestId: abTestId,
targetObjectives: [objectives],
modelInputType: constants.TITLE_INPUT_TYPE,
modelType: 'SCORER'
};
}

These rules are consumed by both the Switchboard and the Model Serving clusters. Given these rules, the serving platform components can take various actions, some detailed below:

Control Plane Flow:

  1. Assignment: Produce model-to-cluster shard assignment.
  2. Validation: Load all specified models into the Serving Cluster Shard and validate model dependencies to ensure successful execution.
  3. Mapping: Provide the model-to-shard VIP address mapping to Switchboard.

Data Plane Flow:

  1. Allocation: If the request is for Objective=ContinueWatchingRanking, query the Experimentation Platform for the userId’s cell allocation.
  2. Model Selection: Use the allocation and A/B test rule to select the appropriate model.
  3. Request Routing: Route the request to the serving cluster shard with the selected model and context.
  4. Model Execution (on the serving host): Run the model workflow steps and return the response.

A key highlight of this setup is the decoupling of the experimentation config from the serving platform code. This includes having an independent release cycle for the rules, separate from the code deployments. Netflix’s Gutenberg system provides an excellent ecosystem that enables a flexible pub-sub architecture, facilitating proper versioning, dynamic loading, easy rollbacks, and more. Both Switchboard and the Serving Cluster Host subscribe to the same Switchboard Rules configuration.

To prevent race conditions and ensure proper sync of the dynamic Switchboard Rules configuration, the following flow is considered:

Evolving Challenges

Switchboard solved the primary problem of improving model iteration and innovation velocity, and provided an excellent ML serving abstraction to over 30 service clients. However, as the system scale increased, a few challenges and problems with this design became apparent:

  • Single point of failure: The presence of Switchboard in the critical request path clearly highlights the risks of shutting down access to all serving hosts in extreme cases, such as unintentional bugs or noisy neighbors sending excessive traffic.
  • Why this matters: Switchboard became a shared dependency whose failure would degrade or disable multiple ML-powered experiences at Netflix.
  • Added latency due to additional network hop: Switchboard in the request path adds between 10–20ms of latency due to serialization-deserialization operations, depending on payload size. Additionally, it further exposes a request to tail latency amplification.
  • Why this matters: The added latency is unacceptable for some latency-sensitive clients, resulting in end-user impact due to service timeouts.
  • Reduced Client flexibility: Switchboard obscures visibility into client request origins from the serving clusters. Consequently, distinguishing data logged for real vs artificial traffic, which is essential for model training, is difficult and requires ongoing customization and increased MLOps overhead.
  • Why this matters: It makes it harder to do tenant separation and test traffic isolation.

What Next? — Lightbulb

The aforementioned challenges of operating Switchboard at scale forced us to rethink the core implementation while retaining its key features. Our goal was not to throw away Switchboard’s design, but to refactor where and how its responsibilities were executed, keeping the benefits while reducing risk and latency. Particularly:

  • Common Client Abstraction
  • Decouple clients from model sharding
  • Flexible traffic routing rules
  • Lightweight system client
  • Single place to define model and experimentation config
  • Fast experimentation config propagation
  • Fallback and client-side caching in case of failures

However, we did want to address some of the previous design choices to move forward with:

  • Remove the routing service from the direct request path: Having a single service in the active request path introduces another failure mode and limits fallback flexibility. While routing rules change infrequently, maintaining consistency comes at the cost of increased availability risks.
  • Separate model inputs from the request metadata: In certain cases, the request payload could be quite large. Needing to deserialize and then re-serialize the payload as it flowed through Switchboard to make a routing decision was a significant contributor to latency and increased serving costs.
  • Provide better isolation for the routing layer: Consolidating multiple use cases (tenants) into a single routing cluster poses two main challenges. First, error propagation posed a risk, as a surge of problematic requests from one tenant could cascade errors back to Switchboard, potentially impacting other users. Second, the cluster had to accommodate diverse latency requirements because the requests from different use cases varied significantly in complexity.

This required some changes in our setup flow: While it largely remained unchanged, however, we created separate components for Routing and Model Selection (Lightbulb):

We now take the rules for an Objective and break them into distinct sets of configuration:

  • Model Serving Configuration: This allows us to determine which model should be used at request time, along with the required metadata
  • Routing Rules: Given a model we want to serve at request time, this tells us which VIP the request should be routed to.

The Data Plane changes also reflect this separation, as we now rely on Envoy to take care of the routing details:

Envoy is already used for all egress communication between apps at Netflix, and it can route requests to different clusters (VIPs) based on the configurable Routing Rules published from our control plane. However, it lacks the information needed to make routing decisions and the ability to enrich the request body with additional serving parameters required for A/B testing model variants. We introduced Lightbulb to cover this gap:

  • Lightbulb consumes the minimal request context, which contains use-case information, and provides the metadata mapping required for routing at the Envoy layer.
  • Lightbulb resolves the request context to determine a routingKey configuration along with the ObjectiveConfig — this is where we place the model id along with other request-specific configurations required for model execution. This is done to separate the config resolution associated with the request from the placement and routing information needed to reach it on the inference cluster.
  • While the routingKey is added to the headers for Envoy proxy to consume, the client adds the ObjectiveConfig parameters to the request itself. This is done to avoid bloating the request headers while passing additional parameters for the model to process the request appropriately.
  • The routing of the actual request is performed by the Envoy proxy, which has the metadata to map the routingKey to the actual cluster VIP running the model. Because the routingKey is in a header, this determination can be made with minimal overhead.

These changes retain the advantages of Switchboard, such as a single integration point, abstraction of model id from use case, context-aware routing, while addressing the challenges we observed over time.

Conclusion

The evolution from Switchboard to Lightbulb marks a significant architectural refinement in our ML model serving infrastructure. While Switchboard provided the initial abstraction layer critical for rapid innovation, its latency and single-point-of-failure risk posed scaling hurdles. The subsequent adoption of Lightbulb, a decoupled service focused solely on routing metadata, and its integration with Envoy successfully resolved these challenges. This sophisticated new architecture preserves the key benefits — seamless client integration and flexible experimentation — while ensuring reliable, efficient, and scalable delivery of personalized member experiences, positioning us well for future ML growth.

In future posts in this series, we’ll dive deeper into other aspects of our ML serving platform, including inference and feature fetching, and how they interact with the routing architecture described here.

Special thanks to Sura Elamurugu, Sri Krishna Vempati, Ed Maddox, and Sreepathi Prasanna for their invaluable feedback and partnership in iterating on this idea and bringing this blog post to life.


State of Routing in Model Serving was originally published in Netflix TechBlog on Medium, where people are continuing the conversation by highlighting and responding to this story.

Security posture improvement in the AI era

Post Syndicated from Celeste Bishop original https://aws.amazon.com/blogs/security/security-posture-improvement-in-the-ai-era/

It’s only been a few weeks since Anthropic announced the Claude Mythos Preview model and launched Project Glasswing with AWS and other leading organizations. This has generated a lot of discussion about the future of cybersecurity and what the ever-increasing capabilities of foundation models mean to organizations.

As AWS CISO Amy Herzog pointed out in the Project Glasswing announcement, “At AWS, we build defenses before threats emerge, from our custom silicon up through the technology stack. Security isn’t a phase for us; it’s continuous and embedded in everything we do.”

Read more from Amy about this in Building AI defenses at scale: Before the threats emerge.

While the discussion around the future of cybersecurity is important, the only thing we know for certain is that organizations need to be able to react quickly to the rapid changes AI is bringing to technology and business in general. And you can’t react quickly if your security fundamentals aren’t dialed in.

The security hygiene gap

It’s easy to assume you have the foundational security elements covered, or to overlook some completely. Basic security use cases like identity management, threat detection, vulnerability management, data protection, and network security can be inconsistently implemented across cloud environments. While AI is reshaping the security landscape, strong security fundamentals continue to be essential for every organization, regardless of size or industry.

These are the security basics that matter whether or not you’re adopting AI: patching consistently, enforcing least-privilege access, enabling logging and monitoring, encrypting data at rest and in transit, and reviewing security configurations regularly. When these fundamentals are in place, you’re better positioned to take advantage of AI-driven tools and respond to newly discovered vulnerabilities, wherever they come from.

While the concepts that drive security fundamentals are universal, implementing them in your environment is best done with an understanding of the context unique to your organization. That’s why we have a multitude of freely available materials—like the AWS Well-Architected Framework—that you can use to help ask the right questions and implement changes in your environment. We also offer programs like the Security Health Improvement Program (SHIP) to help you improve your security posture through prescriptive guidance and continuous improvement.

What is the Security Health Improvement Program (SHIP)?

SHIP is a no-cost program available to every AWS customer, regardless of support tier. SHIP provides a proven, data-driven methodology to:

  • Assess your current security posture using data from your AWS environment
  • Identify specific opportunities to improve across 10 core security use cases
  • Build a prioritized action plan tailored to your environment
  • Establish a mechanism for continuous security improvement

The program is led by AWS Solutions Architects and Technical Account Managers who take you through a personalized report, contextualize findings for your environment, and help you build a prioritized action plan.

Why SHIP matters in the AI era

Project Glasswing highlights an important shift: AI-powered tools are accelerating the pace of vulnerability discovery, which means organizations need to be prepared to assess and respond to findings and changing situations faster than before. In addition to external factors, as organizations adopt AI—whether deploying foundation models, building agentic workflows, or using AI-powered services—how they implement their security controls must change as well. A strong security foundation is what makes confident AI adoption possible.

Here’s how SHIP helps:

Address foundational security gaps proactively

SHIP uses a data-driven methodology to identify opportunities to improve and optimize across 10 core security use cases: threat detection, cloud security posture management, application security testing, configuration management, access governance, vulnerability management, application protection, network security, encryption, and secrets management. The program includes a SHIP assessment to identify critical security findings related to your current security posture, so your team can build a prioritized roadmap for improvement tailored to your environment.

Establish the security baseline AI workloads require

Before you deploy your first model on Amazon Bedrock or build agentic workflows with Amazon Bedrock AgentCore, you need confidence that your underlying infrastructure follows security best practices. SHIP uses actual data from your environment to provide prescriptive, specific guidance rather than generic security recommendations. This is especially relevant as AI-driven vulnerability discovery tools become more widely available: organizations with strong baselines will be able to act on new findings quickly and effectively.

Build a mechanism for continuous security improvement

As AI capabilities evolve, organizations benefit from having a repeatable process to assess and strengthen their security posture over time. SHIP establishes the methodology and mechanisms for your team to continuously assess, prioritize, and improve. By building this operational capability, you’re strengthening your organization’s ability to adapt and contributing to broader industry resilience. As the cybersecurity community integrates AI into defense strategies, SHIP helps you maintain foundational best practices so you can adopt these innovations effectively and with confidence.

Getting started is straightforward

SHIP is available today, at no cost, to every AWS customer. Here’s how to get started:

  1. Talk to your AWS account team. Ask about scheduling a SHIP engagement, or request one directly on the SHIP page.
  2. Attend a SHIP Activation Day. AWS regularly hosts hands-on workshops where you can run the SHIP assessment with AWS Solutions Architects and start building your improvement plan.
  3. Explore the prescriptive guidance. Consult the AWS Well-Architected Framework – Security Lens for documentation, reference architectures, and implementation guides you can start using today.

Take the next step together

AWS is committed to being the most secure cloud, from our participation in Project Glasswing to the security embedded in every layer of our infrastructure. Security is a shared responsibility, and programs like SHIP give customers the tools, guidance, and support to strengthen their security foundations so they can build confidently, no matter what comes next.

Ready to improve your security posture? Contact your AWS account team to schedule a SHIP engagement, or visit the SHIP resources page to learn more.

Celeste Bishop

Celeste Bishop

Celeste is a Senior Security Specialist at AWS, based in Austin, Texas. Over the past five years, she has held a range of security-focused roles spanning field and product marketing, developer relations, and executive engagement. She partners closely with customers, security leaders, and field teams to help organizations operate securely in the cloud. Celeste holds a Bachelor’s in Economics from the University of Texas at Austin.

Metasploit Wrap-Up 05/01/2026

Post Syndicated from Christopher Granleese original https://www.rapid7.com/blog/post/pt-metasploit-wrap-up-05-01-2026

MCP server

This release our very own cdelafuente-r7 finished implementing the Metasploit MCP Server (msfmcpd), bringing Model Context Protocol support to Metasploit Framework. MCP lets AI applications like Claude, Cursor, or your own custom agents query Metasploit data. Think of it as a middleware layer that exposes 8 standardized tools for searching modules and pulling reconnaissance data, all built on the official Ruby MCP SDK.

This first iteration is read-only, covering modules, hosts, services, vulnerabilities, and more. Tools for module execution, session interaction, and database modifications are on the roadmap for a future release. Full details are available in the documentation.

Copy Fail

Earlier this week, details of a new and high profile Linux LPE were released alongside a public PoC. The bug, nicknamed Copy Fail and identified by CVE-2026-31431, is a logic flaw in the cryptographic APIs exposed by the Linux Kernel. Metasploit has shipped a local exploit this week to leverage the flaw on AMD64 and AARCH64 targets with additional architectures planned for future releases. The exploit, which replaces the ‘su’ binary in the page cache with a small ELF file, allows users to specify command payloads for execution and will automatically determine the appropriate target architecture.

New module content (3)

Microsoft Windows HTTP to LDAP Relay

Author: jheysel-r7

Type: Auxiliary

Pull request: #21323 contributed by jheysel-r7

Path: server/relay/http_to_ldap

Description: This adds a new NTLM relay module that relays from HTTP to LDAP. On success, an authenticated LDAP session is opened which allows the operator to interact with the LDAP service in the context of the relayed identity.

Copy Fail AF_ALG + authencesn Page-Cache Write

Authors: Diego Ledda, Spencer McIntyre, Xint Code, and rootsecdev

Type: Exploit

Pull request: #21395 contributed by zeroSteiner

Path: linux/local/cve_2026_31431_copy_fail

AttackerKB reference: CVE-2026-31431

Description: Adds a module for CVE-2026-31431 (The Copy Fail LPE for Linux), a local privilege escalation affecting almost every Linux Kernel since 2017.

Linux Execute Command

Author: Spencer McIntyre

Type: Payload (Single)

Pull request: #21395 contributed by zeroSteiner

Path: linux/aarch64/exec

Description: Adds a module for CVE-2026-31431 (The Copy Fail LPE for Linux), a local privilege escalation affecting almost every Linux Kernel since 2017.

Enhancements and features (5)

Bugs fixed (0)

None

Documentation

You can find the latest Metasploit documentation on our docsite at docs.metasploit.com.

Get it

As always, you can update to the latest Metasploit Framework with msfupdate and you can get more details on the changes since the last blog post from GitHub:

If you are a git user, you can clone the Metasploit Framework repo (master branch) for the latest. To install fresh without using git, you can use the open-source-only Nightly Installers or the commercial edition Metasploit Pro

Announcing the ISO 31000:2018 Risk Management on AWS Compliance Guide

Post Syndicated from Jesse McMahan original https://aws.amazon.com/blogs/security/announcing-the-iso-310002018-risk-management-on-aws-compliance-guide/

AWS Security Assurance Services is announcing the release of our latest compliance guide, ISO 31000:2018 Risk Management on AWS, which provides practical guidance for organizations establishing and operating a risk management program in AWS environments using ISO 31000:2018 principles.

The guide explains how organizations can integrate AWS services into their risk management processes to support the core components of ISO 31000:2018, including establishing context and criteria, conducting risk assessments, implementing risk treatments, and enabling continuous monitoring and review. It also highlights how AWS security, automation, and monitoring capabilities can help customers identify areas for improvement and help enforce controls at large. The guide includes:

  • An overview of the ISO 31000:2018 risk management framework, including context and criteria, risk assessment, risk treatment, and monitoring and review. You will learn how to apply ISO 31000’s core principles within AWS environments and use AWS services for risk identification, detection, treatment, and monitoring.
  • Governance and risk treatment considerations aligned with the AWS Shared Responsibility Model. This includes strategies for risk avoidance, mitigation, transfer, and acceptance.

By combining ISO 31000 risk management principles with AWS security services, organizations can build scalable, automated environments that help support continuous risk identification, proactive treatment, operational visibility, and ongoing compliance readiness.

Download Available: ISO 31000:2018 Risk Management on AWS Compliance Guide

For further assistance, contact AWS Security Assurance Services

If you have feedback about this post, submit comments in the Comments section below.

Jesse McMahan

Jesse McMahan

Jesse is a Sr. Security Assurance Consultant at AWS with over a decade of experience in information security, risk management, and compliance. He holds multiple industry and AWS certifications and leads security assessment and advisory engagements covering standards such as PCI DSS, NIST, SOC 2, HIPAA, and ISO 27001. A United States Marine Corps veteran, Jesse brings a disciplined, mission-focused approach to helping organizations align their security posture with regulatory and business objectives.

Juan Rodriguez

Juan Rodriguez

Juan is a Security Assurance Consultant at AWS, where he works with Strategic Services and customers to assess and secure cloud environments against frameworks including CMMC, FedRAMP, GovRAMP, and NIST based practices. He holds his CMMC Certified Professional and AWS Certified Security – Specialty certifications. Juan pairs technical expertise with a research-driven mindset to help organizations strengthen and architect their security posture and align with federal and industry standards.

Akanksha Chaturvedi

Akanksha Chaturvedi

Akanksha is a Senior Security Assurance Consultant with over 10 years of specialized experience in risk-based security assessments and regulatory compliance across highly regulated industries. Expert practitioner in HIPAA, PCI-DSS, GDPR, FedRAMP, and IRAP frameworks, with demonstrated success in architecting and deploying enterprise security programs from conception through full implementation. Known for delivering innovative, scalable solutions that strengthen security posture while streamlining operational processes aimed at reducing compliance overhead.

Sana Rahman

Sana Rahman

Sana is a Senior Assurance Consultant with AWS Security Assurance Services, and has been a PCI DSS Qualified Security Assessor (QSA) for over a decade. She has extensive knowledge and experience in information security and governance, and deep compliance knowledge in both cloud and hybrid environments. She uses all of this to remove compliance roadblocks for AWS customers and provide guidance in their cloud journey.

Mayur Jadhav

Mayur Jadhav

Mayur is a Senior Assurance Consultant at AWS with over a decade of experience in cloud security, governance, risk management, and compliance. He holds AWS Certified Solutions Architect and Zero Trust Certified Architect (ZTCA) certifications. His career spans leadership roles across organizations including Amazon, AWS, EY-Parthenon, and PwC, where he has advised senior executives on cybersecurity and compliance initiatives across healthcare, financial services, and technology sectors.

София нагоре в бетон, стъкло и червено

Post Syndicated from Боян Юруков original https://yurukov.net/blog/2026/sofia-navisoko/

Тия дни се заговори отново за поредната 75 метрова сграда. Първи за това писа общинският съветник Бойко Димитров, след това Симеон Ставрев, а преди гласуването Спаси София го разпростаниха още. Вчера в Столичния общински съвет все пак предложението на районния кмет Кукурин беше гласувано и прието. Повече за самия случай, защо е скандален и защо се счита за схема може да прочете в Капитал, които са описали добре хронологията.

Тази сграда стана известна, тъй като е на (предимно) общинска земя, но има много други, които са също толкова проблемни от гледна точка на транспорт, подземна инфраструктура, реки, отстояния и прочие. Само преди седмица имаше искане за ПУП за друга 75 метрова сграда. Там обаче по-скоро ще бледнее пред околните долепени едно до друго туловища, които вече са си осигурили гласовете в СОС преди няколко мандата.

Все по-често, когато стане такъв скандал, виждаме снимки от картата ми. В случая с Младост именно визуализацията от 3D картата беше използвана от всички, за да покажат мащабите на предложеното от районния кмет на Младост. Използвах я като показвахме схемата на пловдивския кмет и хуманитарната гимназия и плановете му за застрояване на практически нов квартал без инфраструктура. С нея показах къде минават реките на София и какво се планира да се строи върху тях. Често я срещахме и в отразяването на случая с 215-метровата кула на бул. Черни връх.

В същото време продължава критиката срещу картата ми за очакваното застрояване в София или както я представям обикновено – онази с шарениите. Критиката идва най-вече от инвеститори и архитекти, но и от някои в Столична община и определени районни кметства. Миналата година събрах и отговорих на почти всички упреци и твърдения, които някой е споменавал. Налагало ми се е да обяснявам и поправям твърдения какво показва картата и какво се случва в Младост. Най-вече чувам, че това, което се вижда на картата като обеми и строежи, няма да се случи въобще или няма да е баш така. Ако случая в Младост показа нещо, то е че всъщност картата е повече от точна. Виждаме го отново и отново, особено в междублокови пространства и зелени площи.

Криптобетон, ама нависоко

На база данните събрани в картата, виждаме 8 бъдещи сгради над 100 метра, 36 между 75 и 100 метра и 122 сгради между 50 и 75 метра. Някои от тях се строят, а други се виждат на картата на общината, но липсват всякакви документи кога и как е било решено. За последните знаем, че е на база скрити ПУП-ове и гласувания в СОС преди 2020 г., защото след това следя всички промени автоматично.

Всички обекти може да видите на 3D картата – отваряте филтъра с бутона с фунията, изключвате сградите до 50 метра (първите четири отметки) и остават само по-високите. В галерията долу ще видите няколко района в София с оставени само такива сгради. Може да спрете смяната на снимките с бутона за пауза горе вдясно.

Първата снимка показва планираната нова 75-метрова сграда на мястото на старата офис сграда на Филип Кутев до опасното кръстовище с Черни връх. Около нея се виждат предимно одобрени вече други проекти. Втората снимка показва кула до Японския хотел, както и още една точно пред прозорците на злощастния Златен век на Артекс. Последната кула е видима в портала на общината, липсва всякаква информация или публични документи как се появила и е върху общинска земя. Както видяхме със случаите на схеми за подаряване на милиони на частни интереси в Младост и Изгрев обаче, това не е никаква пречка. Доколкото настоящия районен кмет на Лозенец няма да пусне подобно предложение, това пак не пречи на икономическото мнозинство на СОС да прокара свое.

Следващите три снимки са по протежението на Цариградско шосе и се виждат множеството сгради достигащи и минаващи 75 метра. Вижда се и строящият се вече проект на Тиков исторически свързван с Пеевски, който щеше да бъде облагодетелстван от лобистките поправки на ИТН в предишния парламент. След това показвам Изгрев и Г.М. Димитров, където съм включил няколко сгради, които са малко под 50 метра. От там дойде заветната фраза от транспортен анализ, че „то така или иначе е блокирано движението – още няколко десетки семейства няма какво повече да влошат положението“. За съжаление, районният кмет не прави нищо за озаптяване на тези проекти въпреки заявките му, че спира строежи всякакви. Тук не трябва да пропуснем и абсурдните планове за сграда в Студентски парк и спряният отдавна проект от другия край на парка, заради който вече години улицата е пропаднала.

Следващите снимки показват плановете в Младост, включително от последния скандал. Повечето са по Малинов, в Бизнес парка и отсреща на булеварда. Разбира се, не може да не се върнем отново на Черни връх, където има най-много концентрация на сгради уж със смесени функции, които магически стават изцяло жилищни без паркоместа и отстояния. Плановете за Тодор Александров шокират всички, но тепърва ще видим стена от кули там предвид прецедентите за висок кинт от 6, 7 и нагоре при иначе и без това ненормално високия в части на ОУП на София от 3.5.

Накрая като тест съм въвел по визата за проектиране една вече готова сграда на бул. България. Заложил съм точно височината и очертанията от скицата както съм направил при всички други хиляди. Вижда се, че доста точно очертава какво реално са построили в последствие.

Картата – активност и събиране на данни

За последните 12 месеца картата е била посетена 305 хиляди пъти, 141 хиляди от които от потребители в България. Тук изключвам моите посещения, както и тези от търсачки. Има 36630 уникални IP адреса, което предполага най-много толкова посетители. 632 души отварят картата поне веднъж на седмица. От миналия юни, когато помолих за помощ, до сега 3200 души са подали 10871 сигнала, че сгради вече се строят или са готови. Повечето са обработени.

Питали са ме как добавям данните на картата. На едно събитие на Ratio миналата година показах тази графика и днес я обнових. Дава представа колко полигона съм добавял по дни от края на юли 2024 и сега. Вижда се, че първите два месеца съм добавял по няколко стотин на ден. Впрочем, нашумялата сграда в Младост е там от самото начало – бил съм я въвел още на 6-ти август 2024. Сега през седмица-две обработвам новите искания за ПУП-ове, визи за проектиране, градоустройствени заповеди и други актове със скици. В червено се виждат колко от полигоните въведени в дадения ден са изтрити на по-късен етап заради поправки или по-често – промени в плановете за застрояване.

За последните 21 месеца съм въвел почти 32 хиляди полигона на ръка. От тях 29 хиляди се виждат на картата. 11282 са събрани в 3757 сгради като всеки полигон показва различна височина на части от бъдещия строеж. Останалите 18 хиляди са самостоятелни сгради – от хилядите малки къщи, които никнат по полета и хълмове около София до 75 метрови кули.

Повече по темата

Ако искате да се информирате за нови документи и проекти в района ви или около конкретно място, може да се абонирате за бюлетина ми. Той ще ви информира за документи от общината и редица други институции свързани с имоти в София. Повече за проекта може да прочетете тук.

Писал съм доста за презастрояването, София конкретно и имотния пазар на база това, което виждам в данните. Тези статии може да са ви интересни в тази връзка:

Eden: NHS goes to war against open source

Post Syndicated from jzb original https://lwn.net/Articles/1070864/

Terence Eden reports
that the UK’s National
Health Service
(NHS) is preparing to close almost all of its open-source repositories as a
response to LLM tools, such as Anthropic’s Mythos, becoming more
sophisticated at finding security vulnerabilities. He does not, to put
it mildly, agree with the decision:

The majority of code repos
published by the NHS
are not meaningfully affected by any advance
in security scanning. They’re mostly data sets, internal tools,
guidance, research tools, front-end design and the like. There is
nothing in them which could realistically lead to a security
incident.

When I was working at NHSX during the pandemic, we were so
confident of the safety and necessity of open source, we made sure the
Covid Contact Tracing app was open sourced the minute it was available
to the public
. That was a nationally mandated app, installed on
millions of phones, subject to intense scrutiny from hostile powers –
and yet, despite publishing the code, architecture and documentation,
the open source code caused zero security
incidents.

Furthermore, this new guidance is in direct contradiction to the
UK’s Tech
Code of Practice point 3 “Be open and use open source”
which
insists on code being open.

Lenovo ThinkPad P16 Gen 3 Review Portably Powerful

Post Syndicated from Ryan Smith original https://www.servethehome.com/lenovo-thinkpad-p16-gen-3-review-intel-nvidia-portably-powerful/

We review the Lenovo ThinkPad P16 Gen 3, a powerful Intel Arrow Lake-HX mobile workstation laptop with an NVIDIA RTX PRO 5000 Blackwell GPU

The post Lenovo ThinkPad P16 Gen 3 Review Portably Powerful appeared first on ServeTheHome.

A guide to capacity planning for Airflow worker pool in Amazon MWAA

Post Syndicated from Boyko Radulov original https://aws.amazon.com/blogs/big-data/a-guide-to-capacity-planning-for-airflow-worker-pool-in-amazon-mwaa/

In our previous post, A guide to Airflow worker pool optimization in Amazon MWAA, we explored when adding workers to your Amazon Managed Workflows for Apache Airflow (Amazon MWAA) environment actually solves performance issues, and when it doesn’t. We walked through patterns like high CPU utilization and long queue times where scaling may be appropriate, and anti-patterns like misconfigured Airflow settings and memory leaks where adding workers only masks the real problem. The key takeaway was clear: optimize first, scale second, and always let data drive the decision.

But what happens after you’ve done the optimization work? Your DAGs are efficient, your configurations are tuned, and your environment is running well. Then the business comes knocking: new regulatory requirements, additional data pipelines, expanded reporting. The workload is about to grow, and this time, you genuinely need more capacity.

This is where capacity planning comes in. Knowing how many workers to provision, before the new workload hits production, is the difference between a smooth rollout and a 5 AM SLA breach. In this post, we walk through a practical capacity planning framework for Amazon MWAA worker pools. Using a real-world financial services scenario, we show how to assess your current capacity, project future needs, calculate the right number of base workers, and set up monitoring to keep your environment healthy as workloads evolve.

Scenario: A financial services company needs to plan capacity for a 25% directed acyclic graph (DAG) increase to support new regulatory reporting requirements.

Current vs projected state

The following table compares the current and expected state after adding 25% more DAGs.

 

Metric Current Projected Change
1 DAGs 20 25 25%
2 Peak Tasks (5-7 AM) 80 104 +24 tasks
3 Environment Class mw1.medium mw1.medium No change
4 Base Workers 8 11 +3 workers
5 Tasks per Worker 10 (mw1.medium default) 10 No change
6 Available Capacity 80 slots (8 × 10) 110 slots (11 × 10) +30 slots
7 Peak Utilization 100% (80/80 slots) ⚠ 95% (104/110 slots) Improved
8 Critical SLA 7 AM market open 7 AM market open No tolerance

Capacity planning goal: Reduce utilization from 100% to 95% to maintain service level agreement (SLA) compliance and handle unexpected spikes.

Understanding current capacity: The environment currently runs 8 base workers, providing 80 concurrent task slots (8 workers × 10 tasks per worker). During the 5-7 AM peak with 80 concurrent tasks, this represents 100% utilization, a risky level that leaves no headroom for unexpected spikes or volatility.
With the planned addition of 5 new regulatory reporting DAGs, peak concurrent tasks will grow to 104. To maintain healthy operations with adequate buffer, we need to increase to 11 base workers (110 slots), resulting in 95% peak utilization with 6 slots of breathing room.

Why 100% utilization is risky: Running at 100% task utilization means:

  • Zero buffer for unexpected spikes
  • Any additional task causes immediate queuing
  • No room for market volatility or data volume increases
  • High risk of SLA breaches during unpredictable events

Best practice: Maintain at least 5-15% headroom (85-95% utilization) for production workloads with critical SLAs.

Why this sizing:

  • Current: 80 tasks ÷ 80 slots = 100% utilization (at capacity – risky!)
  • Projected: 104 tasks ÷ 110 slots = 95% utilization (healthy with buffer)
  • Buffer: 6 slots (5% headroom) protects against unexpected volatility spikes
  • SLA protection: Adequate headroom prevents queuing during normal operations

Capacity analysis

Every team asks the same critical question: “How many workers do I need?” The process is to identify your peak concurrent tasks from Amazon CloudWatch metrics, dividing by your environment’s tasks-per-worker capacity, and adding a 5%-15% safety buffer.

Step 1: Identifying peak concurrent tasks from Amazon CloudWatch

To determine your peak workload, you need to analyze RunningTasks and QueuedTasks CloudWatch metrics for your Amazon MWAA environment. Navigate to Amazon CloudWatch and query the following key metrics:

Primary metrics for capacity planning:

  • RunningTasks: Number of tasks currently executing across all workers. This shows your actual concurrent task load.
  • QueuedTasks: Number of tasks waiting for available worker slots. High values indicate insufficient capacity.
  • AvailableWorkers: Current number of active workers in your environment.

How to find peak concurrent tasks:

  1. Open the Amazon CloudWatch Console.
    • Choose Metrics.
    • Choose the MWAA namespace.
  2. Select your environment name.
  3. Add the RunningTasks metric.
  4. Set time range to last 7-30 days.
  5. Change statistic to Maximum.
  6. Identify the highest value during your peak hours (for example, 5-7 AM).

Example query:
Note: The following query is conceptual and does not directly translate to Amazon CloudWatch-specific language. Please refer to the Query your CloudWatch metrics with CloudWatch Metrics Insights for more information.

SELECT MAX(RunningTasks) AS PeakConcurrentTasks
FROM MWAA_Metrics
WHERE Environment = 'prod-airflow'
  AND timestamp BETWEEN '2024-10-01' AND '2024-10-31'
  AND HOUR(timestamp) BETWEEN 5 AND 7;

In our scenario, this analysis revealed 80 concurrent tasks during the 5-7 AM window. With the planned 25% DAG increase, we project this will grow to 104 concurrent tasks.

Step 2: Calculate required workers

To calculate the number of required workers without queuing any tasks, use the following formula: Peak concurrent tasks ÷ Tasks per worker × Safety buffer = Required workers

In the projected scenario with 104 tasks at peak hours, using mw1.medium environment with default concurrency configuration and having a 5% safety buffer, we need 11 workers

  • 104 peak tasks ÷ 10 tasks per worker × 1.06 buffer = 11 workers required to handle your workload without queuing during busiest periods.

Capacity monitoring and triggers

There are a few important Amazon CloudWatch metrics to monitor for environment health.

Key metrics to monitor

Monitor these five critical Amazon CloudWatch metrics to detect capacity issues:

  • QueuedTasks (>10 for >5 minutes indicates insufficient capacity)
  • RunningTasks (consistently at maximum suggests the need for more workers)
  • AdditionalWorkers (active for more than 6 hours daily signals the permanent worker problem)
  • Worker CPU (>85% sustained requires environment class upgrade or workload optimization)
  • Task Duration (+15% increase means reduced effective capacity per worker).

These metrics provide early warning signals to adjust capacity before SLA breaches occur.

 

Metric Threshold Action
1 QueuedTasks >10 for >5 minutes Investigate capacity
2 RunningTasks Consistently at max Increase base workers
3 AdditionalWorkers Active >6 hours daily Increase base workers
4 Worker CPU >85% sustained Upgrade environment class
5 Task Duration +15% increase Review capacity per worker

Amazon CloudWatch monitoring queries

Note: The following queries are conceptual and do not directly translate to Amazon CloudWatch-specific language. Please refer to the Query your CloudWatch metrics with CloudWatch Metrics Insights for more information.

  • Queue depth during peak hours
    SELECT AVG(QueuedTasks)
    FROM MWAA_Metrics
    WHERE Environment = 'prod-airflow'
      AND timestamp BETWEEN '05:00' AND '07:00'
    GROUP BY 5m;

  • Worker utilization efficiency
    SELECT AVG(RunningTasks) / AVG(AvailableWorkers * 5) * 100 AS UtilizationPercent
    FROM MWAA_Metrics
    WHERE Environment = 'prod-airflow';

  • Detect permanent worker problem
    SELECT DATE(timestamp) AS date,
           AVG(AdditionalWorkers) AS avg_additional,
           MAX(AdditionalWorkers) AS max_additional
    FROM MWAA_Metrics
    WHERE AdditionalWorkers > 0
    GROUP BY DATE(timestamp)
    HAVING AVG(AdditionalWorkers) > 5;

Setting up alerts

You can configure these alarms to identify problems as soon as they are introduced.

Recommended Amazon CloudWatch alarms:

  1. High queue depth alert
    • Metric: QueuedTasks
    • Threshold: > 10 for 2 consecutive 5-minute periods
    • Action: Notify operations team
  2. Permanent worker detection
    • Metric: AdditionalWorkers
    • Threshold: > 0 for 6+ hours
    • Action: Review capacity planning
  3. SLA risk alert
    • Metric: QueuedTasks during 5-7 AM window
    • Threshold: > 5 tasks
    • Action: Page on-call engineer

When to revisit capacity planning

Conduct quarterly scheduled reviews to analyze trends and project growth. Also run immediate trigger-based assessments when:

  • DAG count increases >10% (or more than your safety buffer)
  • Performance degrades
  • Cost anomalies appear (indicating permanent workers)
  • Any SLA breach occurs.

This dual approach provides proactive capacity management while enabling rapid response to emerging issues.

 

Trigger Frequency Action
1 Scheduled Review Quarterly Analyze trends, project growth
2 DAG Growth >10% increase Recalculate capacity needs
3 Performance Degradation As observed Immediate capacity assessment
4 Cost Anomalies Monthly Check for permanent workers
5 SLA Breaches Any occurrence Emergency capacity review

Decision matrix

The framework presents three capacity planning approaches, each optimized for different organizational priorities.

The Full Base Worker Provisioning strategy (the conservative path) sets base workers equal to the calculated requirement, eliminating queue times during peak periods and guaranteeing SLA compliance with predictable fixed costs, while automatic scaling handles only unexpected spikes—ideal for mission-critical workloads with strict SLA requirements.

The Minimal Base + Automatic Scaling approach (the cost-focused path) maintains minimal base workers at current levels and relies heavily on automatic scaling, accepting 3-5 minute delays during peak periods and SLA breach risks in exchange for lower baseline costs, though this requires intensive monitoring and carries explicit warnings about high SLA risk.

The Hybrid Approach (the balanced path) provisions base workers at 80% of the calculated requirement with automatic scaling covering the remaining 20%, resulting in 2-3 minute delays during spikes while balancing cost against performance—suitable for moderate SLA requirements with some budget constraints.

The comparison table contrasts queue times (under 30 seconds versus 2-3 minutes versus 3-5 minutes), SLA compliance levels (guaranteed versus high probability versus at-risk during peak), and ideal use cases (mission-critical predictable workloads versus moderate SLA requirements with budget constraints versus development environments with flexible SLA tolerance), enabling teams to make informed provisioning decisions aligned with their operational requirements and financial constraints.

Key takeaway

Effective capacity planning prevents both under-provisioning (SLA breaches) and over-provisioning (cost overruns).

Capacity planning principles

  1. Calculate capacity needs BEFORE adding workload – Use peak task projections with 5-15% safety buffer
  2. Size minimum workers for peak demand – Don’t rely on automatic scaling for predictable loads
  3. Use automatic scaling only for unexpected spikes – Treat as safety net, not primary capacity
  4. Target 85-95% utilization during peak hours – Ensures headroom for unexpected growth
  5. Plan 5-15% headroom for unexpected growth – Production often differs from testing
  6. Monitor AdditionalWorkers metric – If active >6 hours daily, increase base workers
  7. Review quarterly + trigger-based assessments – Regular reviews plus immediate action on issues
  8. Balance cost and performance based on SLA criticality – Business impact justifies infrastructure investment

Success metrics

  • Queue efficiency: Average queue time <30 seconds during peak
  • SLA compliance: >99.5% of critical tasks complete on time
  • Resource utilization: 85-95% during peak hours (optimal efficiency)
  • Cost predictability: <10% variance in monthly worker costs

Conclusion

Capacity planning is not a one-time exercise. It’s an ongoing discipline. The framework we’ve outlined gives you a repeatable process: measure your current peak utilization through CloudWatch metrics, project growth based on incoming workloads, calculate the required workers with an appropriate safety buffer, and monitor continuously to catch drift before it becomes an outage.

The financial services scenario in this post illustrates a common reality: running at 100% utilization during peak hours leaves zero room for the unexpected. By sizing to 95% peak utilization with a modest buffer, the team gained the headroom needed to absorb volatility without risking their 7 AM market-open SLA.

Whether you choose full base worker provisioning for mission-critical pipelines, a hybrid approach for moderate SLA requirements, or lean on automatic scaling for development workloads, the right strategy depends on your business context, not a one-size-fits-all rule. Pair your capacity plan with the CloudWatch alarms and review triggers we covered, and you’ll catch capacity gaps early.

Combined with the optimization-first approach from Part 1, you now have a complete toolkit: diagnose before you scale, optimize before you provision, and plan before you deploy. Your MWAA environment and your on-call engineers will thank you.

To get started, visit the Amazon MWAA product page and the Amazon MWAA console page.

If you have questions or want to share your MWAA capacity planning, leave a comment.

About the authors

Boyko Radulov

Boyko Radulov

Boyko is a Senior Cloud Support Engineer at Amazon Web Services (AWS), Amazon MWAA and AWS Glue Subject Matter Expert. He works closely with customers to build and optimize their workloads on AWS while reducing the overall cost. Beyond work, he is passionate about sports and travelling.

Kamen Sharlandjiev

Kamen Sharlandjiev

Kamen is a Principal Big Data and ETL Solutions Architect, Amazon MWAA and AWS Glue ETL expert. He’s on a mission to make life easier for customers who are facing complex data integration and orchestration challenges. His secret weapon? Fully managed AWS services that can get the job done with minimal effort. Follow Kamen on LinkedIn to keep up to date with the latest Amazon MWAA and AWS Glue features and news.

Venu Thangalapally

Venu Thangalapally

Venu is a Senior Solutions Architect at AWS, based in Chicago, with deep expertise in cloud architecture, data and analytics, containers, and application modernization. He partners with financial service industry customers to translate business goals into secure, scalable, and compliant cloud solutions that deliver measurable value. Venu is passionate about using technology to drive innovation and operational excellence.

Harshawardhan Kulkarni

Harshawardhan Kulkarni

Harshawardhan is a Partner Technical Account Manager at AWS, Amazon MWAA Subject Matter Expert. Based in Dublin Ireland, he partners with Enterprise Customers across EMEA to help navigate complex workflows and orchestration challenges while ensuring best practice implementation. Outside of work, he enjoys traveling and spending time with his family.

Andrew McKenzie

Andrew McKenzie

Andrew is a Data Engineer and Educator who uses deep technical expertise from his time at AWS. As a former Amazon MWAA Subject Matter Expert, he now focuses on building data solutions and teaching data engineering best practices.

A guide to Airflow worker pool optimization in Amazon MWAA

Post Syndicated from Boyko Radulov original https://aws.amazon.com/blogs/big-data/a-guide-to-airflow-worker-pool-optimization-in-amazon-mwaa/

Optimizing the Airflow worker pool configuration in Amazon Managed Workflows for Apache Airflow (Amazon MWAA), the AWS fully managed Apache Airflow service, is an important yet often overlooked strategy for scaling workflow operations. Tasks queued for longer periods can create the illusion that additional workers are the solution, when in reality the root cause might lie elsewhere. The decision to scale isn’t always straightforward. DevOps engineers and system administrators frequently face the challenge of determining whether adding more workers will solve their performance issues or only increase operational cost without addressing the root cause.

This post explores different patterns for worker scaling decisions in Amazon MWAA, focusing on the task pool mechanism and its relationship to worker allocation. By examining specific scenarios and providing a practical decision framework, this post helps you determine whether adding workers is the right solution for your performance challenges, and if so, how to implement this scaling effectively.

Main patterns

This section discusses the most frequently seen problems that raise the question if adding additional workers would improve the health of your environment.

High CPU

Airflow serves as a workflow management platform that coordinates and schedules tasks to be run on external processing services. It acts as a central orchestrator that can trigger and monitor tasks across various data processing systems like AWS Glue, AWS Batch, Amazon EMR, and other specialized data processing tools. Rather than processing data itself, Airflow’s strength lies in managing complex workflows and coordinating jobs between different systems and services.

In Analytics and Big Data environments, there is a prevalent misconception that saturated resources automatically warrant adding more capacity. However, for Amazon MWAA, understanding your workflow characteristics and optimization opportunities should precede scaling decisions.

As you scale up your workflows, resource utilization of the Airflow clusters naturally increases. When workers consistently operate at full capacity, it may seem intuitive to add additional compute resources. However, this approach often masks underlying inefficiencies rather than resolving them.

For example, in Amazon MWAA if you are running a single task that is consuming 100% of the available CPU on your Amazon MWAA worker, adding additional workers will not resolve the problem as the task is not optimized nor split into smaller parts. As such, increasing the number of minimum workers will not bring the expected effect but will only increase the operating costs.

When your Amazon MWAA workers are consistently running above 90% CPU or Memory utilization, you’ve reached a critical decision point. Before taking actions, it is essential to understand the root cause. You have three primary options:

  1. Scale horizontally by adding additional workers to distribute the load.
  2. Scale vertically by upgrading to a larger environment class for more resources per worker.
  3. Optimize your DAGs and scheduling patterns to be more efficient and consume fewer resources.

Each approach addresses different underlying issues, and choosing the right path depends on identifying whether you are facing a capacity constraint, resource-intensive task design, or workflow inefficiency. For guidance on optimization strategies, please refer to Performance tuning for Apache Airflow on Amazon MWAA.

To monitor the CPUUtilization and MemoryUtilization on the workers, refer to the Accessing metrics in the Amazon CloudWatch console and choose the corresponding metrics.

  1. Select a time window long enough to show usage patterns.
  2. Set period to 1 Minute.
  3. Set statistics to Maximum.

Long queue time

Sometimes Airflow tasks are stuck in a queued state for a long time, which prevents DAGs from completing on time.

In Amazon MWAA, each environment class comes with configured minimum and maximum worker nodes. Each worker provides a pre-configured concurrency, which is the number of tasks that can run simultaneously on each worker at any given time. The behavior is controlled through celery.worker_autoscale=(max,min).

For example, if you have minimum 4 mw1.small workers, with default Airflow configuration, you will be able to run 20 concurrent tasks (4 workers x 5 max_tasks_per_worker). If your system suddenly requires more than 20 tasks to execute concurrently, this will result in an autoscaling event. Amazon MWAA will decide how to scale your workers efficiently, and trigger the process. The autoscaling process, however, requires additional time to provision new workers resulting in additional tasks in queued status. To mitigate this queuing issue, consider the following:

  1. If the CPU utilization on the workers is low, increasing the max value in celery.worker_autoscale=(max,min) can reduce the time tasks stay in queued state as each worker will be able to process more tasks concurrently. Airflow worker can take tasks up to the defined task concurrency regardless of the availability of its own system resources. As a result, the base worker may reach 100% CPU/Memory utilization before Autoscaling takes effect.
  2. If you do not want to increase the task concurrency on the workers, increasing the minimum worker count can also be beneficial because having more available workers allows a higher number of tasks to run concurrently.

Scheduling delays

Adding new DAGs can not only affect your system resources, but it can also create uneven scheduling patterns. Some DAGs may experience delayed execution because of resource competition, even when the overall environment metrics appear healthy. This scheduling skew often manifests as inconsistent task pickup times, where certain workflows consistently wait longer in the queue while others execute promptly.

When Amazon CloudWatch metrics show increasing variance in task scheduling times, particularly during periods of high DAG activity, it signals the need for environment optimization. This scenario requires careful analysis of execution patterns and resource utilization to determine if:

  1. While adding workers can help distribute the workload, this solution is most effective when the high utilization is primarily because of task execution load rather than DAG parsing or scheduling overhead. Adding more minimum workers will allow you to execute more tasks in parallel. For example, if you observe the value of AWS/MWAA/ApproximateAgeOfOldestTask to be steadily increasing, it means that the workers are not able to consume the messages from the queue fast enough. Additionally, you can also monitor the AWS/MWAA/QueuedTasks to identify similar patterns.
  2. Upgrading the environment class would provide better scheduling capacity. If the Scheduler is showing signs of strain or if you’re seeing high resource utilization across all components, upgrading to a larger environment class might be the most appropriate solution. This provides more resources to both the Scheduler and Workers, allowing for better handling of increased DAG complexity and volume. To validate the same, use AWS/MWAA/CPUUtilization and AWS/MWAA/MemoryUtilization in the Cluster metrics and choose Scheduler, BaseWorker and AdditionalWorker metrics.
  3. Restructuring DAG schedules would reduce resource contention.

The key is to understand your workflow patterns and identify whether the scheduling delays are because of insufficient worker capacity or other environmental constraints.

Anti patterns

This section showcases the most common anti patterns which make MWAA users think that adding more workers will improve performance.

Underutilized workers

When evaluating Amazon MWAA performance bottlenecks, it’s important to distinguish resource constraints and DAG design inefficiencies before scaling the environment.

Sometimes the Amazon MWAA environment has the capacity to run 100 tasks concurrently but your queue metrics (AWS/MWAA/RunningTasks) show only 20 tasks active most of the time with no tasks remaining in queued state. In such scenarios, you are advised to check Amazon CloudWatch for consistently low CPU and memory usage on existing workers during peak workload times. If this is confirmed, it is usually an indication of inefficiencies in DAG design, scheduling patterns, or Airflow configuration.

You have two primary options to address this:

1. Downsize: If you do not expect your workload to increase, it is safe to assume you have over-provisioned your cluster. Start by removing any extra workers first and finally resolve to downsizing your environment class.

2. Optimize: Fine tune your DAG scheduling and airflow configuration through Pools and Airflow configuration for concurrency to increase the throughput of your system.

Misconfigured Airflow configurations that create artificial bottlenecks

In Apache Airflow, performance bottlenecks often occur because of configuration settings, not actual resource constraints. At such times, DAG executions get delayed not because of insufficient compute, but because of incorrect concurrency configuration.

Efficient use of Amazon MWAA requires reviewing not only resource utilization for Workers and Schedulers but also concurrency configurations for artificially created bottlenecks. Sometimes one restrictive configuration prevents the scaling benefits of larger environment or additional workers. Always audit Airflow configurations if performance seems limited even when system metrics suggest spare capacity.

Important consideration: Amazon Managed Workflows for Apache Airflow (Amazon MWAA) does not automatically update the worker concurrency configuration when you change the environment class. This behavior is important to understand when scaling your environment. If you initially create an mw1.small environment, where each worker can handle up to 5 concurrent tasks by default. When you upgrade to a medium environment class (which supports 10 concurrent tasks per worker by default), the concurrency setting remains at 5 for in-place updated environments. You must manually update the concurrency configuration to take full advantage of the increased capacity available in the medium environment class.

Because of this you need to also update the Airflow configurations that control concurrency whenever you update the environment class. To update the concurrency setting after upgrading your environment class, modify the celery.worker_autoscale configuration in your Apache Airflow configuration options. This makes sure your workers can process the maximum number of concurrent tasks supported by your new environment class.

Other times, an Amazon MWAA environment can be constrained by max_active_runs or DAG concurrency controls instead of actual resource limits. These configuration-based throttles prevent tasks from running, even when the worker instances have available compute to handle the workload.

There is an important distinction between the two. Configuration limits act as artificial caps on parallelism, while true resource limits indicate that workers are fully utilizing their CPU or memory capacity. Understanding which type of constraint affects your environment helps you determine whether to adjust configuration settings or scale your infrastructure.

Adjusting Airflow configurations such as Pools, concurrency, max_active_runs solves performance problems without scaling workers. Some of the configurations you can use to control this behavior:

  1. max_active_runs_per_dag (DAG level): Controls how many DAG runs for a given DAG are allowed at the same time. If set to 2, only 2 DAG runs can run concurrently, even if there is plenty of worker capacity left. Extra runs queue, making the DAG executions slow even though workers are idle.
  2. max_active_tasks:Controls the concurrency field in a DAG definition (or setting at environment level) limits the number of tasks from the DAG running at any moment, regardless of overall system capacity or number of workers.
  3. Pools:Pools restrict how many tasks of a certain type (often resource heavy) can run at once. A pool with only 3 slots will throttle any tasks above 3 assigned to that pool, leaving workers idle.
  4. Execution timeouts and retries: If not tuned, failed tasks might fill up slots unnecessarily, stuck tasks can block worker slots and slow queue processing.
  5. Scheduling intervals and dependencies: Overlapping or inefficient scheduling may cause idle periods or excess contention for resources, affecting real throughput.

How Airflow configurations can override each other

Airflow has multiple layers of concurrency and scheduling controls. Some at the environment level, some at the DAG/task level, and others for pools. Sometimes more restrictive settings override more permissive ones, resulting in unexpected queue buildup.

DAG level vs Environment level: If “max_active_runs_per_dag” (DAG level) is lower than the environment-level “max_active_runs_per_dag” or system wide concurrency, the DAG setting is used, throttling tasks even if the environment could do more.

Task level overrides: Individual task definitions can have their own parameters like “max_active_tis_per_dag” which can cap runs per task and create a bottleneck if set lower than global settings.

Order of precedence: The most restrictive relevant configuration at any level (Environment, DAG, Task) effectively sets the upper bound for parallel task execution.

Setting Location Setting Effect on task throughput
Environment Level parallelism Max total tasks running on Scheduler
DAG Level max_active_runs Max simultaneous DAG runs
Task Level concurrency Max concurrent task for that DAG

Performance issues often resemble resource exhaustion, but actually derive from overly restrictive configurations. Audit all the preceding parameters carefully. You can loosen restrictive values step by step and monitor their effect before deciding to scale your cluster further. This approach ensures optimal and cost-efficient usage of your cloud resources without paying for idle capacity.

Slow resource depletion from memory leaks

A common scenario for memory leak or slow resource depletion in Amazon MWAA is when DAGs and tasks begin to fail or slow down over time. Scaling workers or increasing environment size does not resolve the underlying issue. This happens because the root cause is not a lack of capacity but rather an application-level leak that causes persistent exhaustion.

For example, as Airflow continuously runs tasks and parses DAGs over time, memory consumption can steadily increase across the environment. This might manifest as an Amazon MWAA metadata database experiencing declining FreeableMemory metrics despite consistent or even reduced workloads. When this occurs, database query performance gradually declines as memory resources become constrained for scheduler/worker & metadata database, ultimately affecting overall environment responsiveness since Airflow depends heavily on its metadata database for critical operations. This scenario is similar to how an application might create database connections without properly closing them, leading to resource exhaustion over time.

Graph: Declining FreeableMemory and MemoryUtilization

Common causes:

  1. Connection pool exhaustion: DAGs that fail to properly close database connections can lead to connection pool exhaustion and memory leaks in the database.
  2. Resource-intensive operations: Complex, long-running queries or XCOM operations against the metadata database can consume excessive memory.
  3. Inefficient DAG design: DAGs with numerous top-level Python calls can trigger database queries during DAG parsing. For instance, using variable.get() calls at the DAG level rather than at the task level creates unnecessary database load.

Recommended solutions:

  1. Implement Amazon CloudWatch monitoring: Establish Amazon CloudWatch alarms for FreeableMemory with appropriate thresholds to detect issues early.
  2. Regular database maintenance: Perform scheduled database clean-up operations to purge historical data that is no longer needed.
  3. Optimize DAG code: Refactor DAGs to move database operations like variable.get() from the DAG level to the task level to reduce parsing overhead.
  4. Connection management: Make sure all database connections are properly closed after use to prevent connection pool exhaustion.

By following the preceding recommendations you can maintain healthy memory utilization for the metadata database and maintain optimal performance of your Amazon MWAA environment without needing to scale workers.

Conclusion

The decision to add workers in Amazon MWAA environments requires careful consideration of multiple factors beyond simple task queue metrics. In this post, we showed that while adding workers can address certain performance challenges, it’s often not the optimal first response to system bottlenecks.

Key considerations before scaling workers include:

  1. Root cause analysis
    • Verify whether high CPU/memory usage stems from task optimization issues.
    • Examine if queuing problems result from configuration constraints rather than resource limitations.
    • Investigate potential memory leaks or resource depletion patterns.
  2. Configuration optimization
    • Review and adjust Airflow parameters (concurrency settings, pools, timeouts).
    • Understand the interaction between different configuration layers.
    • Optimize DAG design and scheduling patterns.

The most successful Amazon MWAA implementations follow a systematic approach: first optimizing existing resources and configurations, then scaling workers only when justified by data-driven capacity planning. This approach ensures cost-effective operations while maintaining reliable workflow performance.

Remember that worker scaling is only one tool in the Amazon MWAA optimization toolkit. Long-term success depends on building a comprehensive performance management strategy that combines proper monitoring, proactive capacity planning, and continuous optimization of your Airflow workflows.

In the next post, we discuss capacity planning and the steps you need to perform before adding additional DAGs in your environment so that you can plan for the additional load and make sure you have enough headroom.

To get started, visit the Amazon MWAA product page and the Performance tuning for Apache Airflow on Amazon MWAA page.

If you have questions or want to share your MWAA scaling experiences, leave a comment below.

About the authors

Boyko Radulov

Boyko Radulov

Boyko is a Senior Cloud Support Engineer at Amazon Web Services (AWS), Amazon MWAA and AWS Glue Subject Matter Expert. He works closely with customers to build and optimize their workloads on AWS while reducing the overall cost. Beyond work, he is passionate about sports and travelling.

Kamen Sharlandjiev

Kamen Sharlandjiev

Kamen is a Principal Big Data and ETL Solutions Architect, Amazon MWAA and AWS Glue ETL expert. He’s on a mission to make life easier for customers who are facing complex data integration and orchestration challenges. His secret weapon? Fully managed AWS services that can get the job done with minimal effort. Follow Kamen on LinkedIn to keep up to date with the latest Amazon MWAA and AWS Glue features and news.

Venu Thangalapally

Venu Thangalapally

Venu is a Senior Solutions Architect at AWS, based in Chicago, with deep expertise in cloud architecture, data and analytics, containers, and application modernization. He partners with financial service industry customers to translate business goals into secure, scalable, and compliant cloud solutions that deliver measurable value. Venu is passionate about using technology to drive innovation and operational excellence.

Harshawardhan Kulkarni

Harshawardhan Kulkarni

Harshawardhan is a Partner Technical Account Manager at AWS, Amazon MWAA Subject Matter Expert. Based in Dublin Ireland, he partners with Enterprise Customers across EMEA to help navigate complex workflows and orchestration challenges while ensuring best practice implementation. Outside of work, he enjoys traveling and spending time with his family.

Andrew McKenzie

Andrew McKenzie

Andrew is a Data Engineer and Educator who uses deep technical expertise from his time at AWS. As a former Amazon MWAA Subject Matter Expert, he now focuses on building data solutions and teaching data engineering best practices.

[$] Version-controlled databases using Prolly trees

Post Syndicated from daroc original https://lwn.net/Articles/1068864/

Modern database and filesystems make pervasive use of

B-trees
, which are tree
structures optimized for storing sorted lists of keys and values on block
devices.

Dolt
is an Apache 2.0-licensed project that makes clever use of a
variant of a B-tree to support efficient version control for an entire database.
The data structure it uses could well be of interest to other projects.

Security updates for Friday

Post Syndicated from jzb original https://lwn.net/Articles/1070848/

Security updates have been issued by AlmaLinux (fence-agents), Debian (chromium, dovecot, and kernel), Fedora (chromium, dotnet10.0, dotnet8.0, dotnet9.0, emacs, glow, jfrog-cli, openbao, pyp2spec, python3.6, rust-rustls-webpki, vhs, and xen), Oracle (grafana, grafana-pcp, PackageKit, sudo, vim, and xorg-x11-server), Red Hat (rhc), SUSE (avahi, bouncycastle, chromium, container-suseconnect, firewalld, gdk-pixbuf, grafana, java-25-openjdk, kernel, libixml11, libmozjs-140-0, libpng12-0, libsodium, libssh, mariadb, Mesa, ntfs-3g_ntfsprogs, openCryptoki, openexr, packagekit, prometheus-postgres_exporter, python-jwcrypto, python-mako, python-Pygments, python-pynacl, python311, python311-pyOpenSSL, python315, radare2, sed, and vim), and Ubuntu (kmod and zulucrypt).

Пирамидата

Post Syndicated from Емилия Милчева original https://www.toest.bg/piramidata/

Пирамидата

От „завладяна държава“ 1.0 България минава към версия 2.0, сменяйки модела на концентрация на власт. Абсолютното мнозинство от 131 депутати около Румен Радев предполага стабилност и бързо съставяне на правителство. Радев обеща това да стане до 15 май, по-малко от месец след изборите. Само правителството на БСП–ДПС през 2013 г. беше сформирано за по-кратко време – за 17 дни. 

Вместо мрежи на влияние, подчинени на олигархична фигура, която държи за заложници лидери и партии, сега се очертава модел на централизирано политическо мнозинство по армейски образец. Новите политици обещават да разградят обвързаностите от миналото, но по-вероятно е само да опростят каналите за влияние.

Няма кой да им противостои. Срещу тях е една раздробена опозиция в лицето на ГЕРБ–СДС, разделилите се ден преди старта на новия парламент „Продължаваме промяната“ (ПП) и „Демократична България“ (ДБ) и „Възраждане“. Номинално и ДПС – Ново начало е в този лагер. Никоя от изброените партии не може да се превърне в ядро, около което да се обединят останалите при ерозия на бездруго отслабената демокрация. 

Избирателите оставиха България без имунна система срещу заплахата от автокрация, а егото на партийни лидери и калкулациите за колаборация довършиха останалото. 

А на страната на Румен Радев е туитът на американския президент Тръмп: 

Този, който спасява държавата си, не нарушава никакъв закон. 

Тоест всяко беззаконие и всеки съюзник могат да бъдат оправдани с висока цел, например демонтаж на „олигархичния модел“. 

Правителство до 15 май

Погледите са вперени в изгряващата звезда на „Прогресивна България“ и в бъдещия премиер. До конституирането на 52-рия парламент Радев беше потънал в мълчание, ограничавайки публичната си комуникация до постове в социалните мрежи. Кой главнокомандващ предварително съобщава на войниците за плановете си? Те са длъжни да го следват и да изпълняват заповедите му. 

Мълчанието на Радев струва злато
Наблюдаваме феномена „Румен Радев на Шрьодингер“. Докато мълчи, той едновременно е срещу корупцията и мафията в правосъдието, за диалог с Русия, против еврото, за ЕС… Това ще свърши с обявяването на партийните му листи. И после? Коментар от Емилия Милчева.
Пирамидата

Но на входа на парламента, заобиколен от надвикващи се журналисти, Радев не беше така енигматичен – „ще стабилизираме финансите, които са в катастрофално състояние“, „няма да правим министерство на културизма (сливане на министерствата на културата и на туризма – б.а.)“. 

За председател на парламента бе избрана 41-годишната юристка от „Прогресивна България“ Михаела Доцова, която ръководеше кабинета на екоминистъра Манол Генов (БСП).

Очаква се още в първите 100 дни от управлението Радев да демонстрира сила и контрол, защото сам каза, че „хората очакват бързи промени“. Смените в регулатори, служби, митници, НАП, държавни фирми и предприятия няма да се отлагат, но ще вървят паралелно със заявените приоритети: бюджет за 2026 г., подготовка на закони, свързани с Плана за възстановяване и устойчивост (ПВУ), и избор на нов състав на Висшия съдебен съвет и на Инспектората към ВСС. 

Механизмите, по които ще се извърши подборът на кандидатите за ВСС, ще покажат дали Радев търси верни „въшки“, по израза на Йордан Стоев от настоящия ВСС за колегите му, или почтени професионалисти. 

Освен бюджета и политиките за разходи, които ще заложи, от значение са законопроектите по ПВУ. „Имаме свои идеи“, отговори Радев на въпрос дали ще използва разработени предложения от служебния правосъден министър Андрей Янкулов. Става въпрос за нов антикорупционен закон и съставяне на антикорупционен орган, за които Европейската комисия е поставила срок – 4 май, който вероятно ще бъде предоговорен. Заради неизпълнението на тази реформа са замразени над 360 млн. евро по второто и третото плащане. 

Янкулов предлага нов антикорупционен закон, с който отново да бъде създадена Комисия за противодействие на корупцията (КПК). Идеята е да се гарантира политическа неутралност. Проектът му предвижда КПК да е петчленна, за разлика от предишната тричленка – с по един представител на Народното събрание, президента, Върховния касационен съд, Върховния административен съд и Висшия адвокатски съвет; с петгодишен мандат, без право на преизбиране.

Заради неизпълнени ангажименти в енергетиката по ПВУ – закон, свързан с ВЕИ сектора, и преструктурирането на БЕХ, за да бъдат извадени от холдинга „Мини Марица-изток“ и ТЕЦ „Марица-изток 2“ България може да загуби други над 440 млн. евро. Остава несигурността за миньорите в Маришкия басейн, които не искат съкращения, а настояват да получават настоящите си възнаграждения. 

Радев, ще удряш ли с юмрука?
Абсолютното мнозинство дава възможност за бързи решения без оправдания. Първият тест е кадровият – ВСС, главен прокурор, регулатори. От него ще се види към обещаната промяна ли се върви, или „юмрукът“ ще пренарежда същата система с други лица. От Емилия Милчева.
Пирамидата

(Не)възможната съпротива

Проблемът не е в абсолютното мнозинство – такава е волята на суверена, а в липсата на работещи институции и механизми на българската парламентарна демокрация. Ако управлението на Радев залитне към евразийски модели, не е сигурно дали ще предизвика силен протестен отпор.

Показателни в това отношение са няколко сценария. Например ако ПБ реши да одобри законопроекта на „Възраждане“ за чуждестранните агенти, насочен срещу неправителствени организации и лица, получаващи финансиране от чужбина. Лидерът на „Възраждане“ Костадин Костадинов упорства и го внася в няколко поредни парламента. Подобен закон действа и в Русия.

Или ако депутатите на ПБ отменят споразумението с Украйна в сферата на сигурността, сключено от служебното правителство на Андрей Гюров. Такъв опит беше направен в разгара на предизборната кампания и получи подкрепата на всички формации в 51-вия парламент без ПП–ДБ, но липсата на кворум накрая попречи на гласуването. 

Отива ли България там, откъдето Унгария се връща?
Унгария затваря цикъл, а България сякаш е на прага на нов. Между фигурата на „спасителя“, руското влияние и отслабващите институции стои въпросът „Накъде завиваме ние?“. Коментар на Светла Енчева.
Пирамидата

Още в първия ден на парламента обаче председателят на групата на ПБ Петър Витанов, бивш евродепутат от ПЕС/БСП, атакува кабинета на Гюров заради споразумението. А избраният от президента Радев конституционен съдия проф. Янаки Стоилов шокира мнозина със забележката си в БНТ дали не е време да променят дизайна на студиото, където преобладават цветовете на Украйна – синьо и жълто. В същото студио той обаче постави и съществен въпрос:

Имаме ли нужда от постоянен Висш съдебен съвет? Вместо това да осигури по-голямо самоуправление и независимост на съдебната власт, доведе до откъсване на тези, които управляват съдебната власт, от хората, които са адресати на управлението. Дори допълнително овластяване, защото ВСС е замислен преди всичко като кадрови орган, а не просто като една система за управление на всякакви въпроси на съдебната власт.

Снишаване и смълчаване

От лагера на опозицията се чува единствено как ръмжат един срещу друг ПП и ДБ. Също и шумът от натискане на копчетата, когато ГЕРБ–СДС и ДПС – Ново начало подкрепиха Доцова за председател на парламента заедно с партията на Радев.

ГЕРБ се топи, а Бойко Борисов се страхува. Зает е да охранява остатъка от онова-което-има-като-партия, тъй като и кметове, и „клиенти“, и бизнес се изплъзват към Радев. Напускането на ръководството на ГЕРБ от знакова фигура – кмета на Стара Загора Живко Тодоров, който кара четвърти мандат, е знак за ерозия. С наближаването на местните избори догодина нейният мащаб ще става все по-видим. От парламента се отказа и друг политик от ГЕРБ – бившият правосъден министър и бивш председател на Столичния общински съвет Георги Георгиев, който е избрал адвокатската кантора, макар да имаше нескрити амбиции в политиката. 

Делян Пеевски се е смълчал, за да не бие на очи. След периода си на медийна доминация санкционираният за корупция олигарх се появи в първия ден на новия парламент на първия ред, демонстрирайки добро настроение. 

За онази част от ДПС, която остана вярна на Ахмед Доган, обаче се очаква да получи позиции в изпълнителната власт. Радев направи пробив в относително монолитния, макар и спадащ през годините етнически вот, въпреки наратива си за „турското робство“ в свое изявление три дни преди вота.

Една политическа общност, която трудно събира 7% обществена подкрепа, която се срамува от нашата история, от българското знаме, от думичката „родолюбие“ и която я е страх да каже кой ни е освободил от турско робство, си мисли, че властта ѝ се полага по право и иска да управлява. Те много добре разбират, че не могат да спечелят изборите, и затова от някакви измислени НПО-та изскочиха сигнали за социални мрежи и внушения, насочени към „Прогресивна България“, по които служебното правителство сезира Европейската комисия, да активира европейските механизми за защита от външни хибридни влияния. Не е ясно дали тази общност осъзнава какво върши и че омаскарява България, че ние тук сме зависими от някакви влияния. Никой отвън не може да дойде и да ни каже за кого и за какво да гласуваме. Това решаваме тук ние, българите. На 19 април ще покажем на тази общност, че няма да стане по този начин.

На изборите на 19 април „Прогресивна България“ е трета в Турция със 17,3% от гласовете, след ДПС (53,1%) и Алианса за права и свободи (21,1%). В 9-ти МИР Кърджали, където ДПС обикновено печели и петте мандата, ПБ и „Възраждане“ взеха по един.

В България ДПС и АПС заедно събират малко над 280 000 гласа – твърде слаб резултат, който показва, че старите механизми на етнически вот, нагласени в началото на Прехода, вече ръждясват. Самият вот намалява, а все повече български граждани от турски произход избират други партии извън капсулата ДПС. 

Междувременно във „Възраждане“ са разбрали, че танцът им в политиката е към края си. Но поне се записаха с едно-две прости изречения в историята: „Не на еврото!“, „Не на подкрепата за Украйна!“. Основните им послания обаче се изчерпаха, а антисистемният играч на терена ги помете. Би могло да се нарече и еволюция.

Еволюция?

Раздялата на ПП с ДБ и обособяването им в две отделни парламентарни групи непосредствено след като се класираха за 52-рото Народно събрание като коалиция, разкриха, че под скандалите за депутатските мандати тлеят сериозни противоречия. Съюзът, формиран през 2022 г., няма коалиционно споразумение, нито е бил обединен досега от общи кампании, общ щаб, общи послания. 

В опит да стопират разделянето, слухове за което вървяха в последните дни, от „Да, България“ предложиха коалиционно споразумение. По-късно се даде и идеята с тригодишна давност „за единен политически субект център–дясно“ между ПП и ДБ, макар никой да не храни илюзии, че това е възможно.

Въпреки настойчивите опити на ДБ да запази целостта на общата парламентарна група, в крайна сметка тя се счупи.

В България има нова ситуация. Избирателите натовариха със свръхвласт първата политическа сила. Тогава, когато има концентрация на власт, особена отговорност е на опозицията да бъде единна и ефективна, за да може да гарантира демократичния ред в страната, така че за нас нито една математика, нито едно техническо средство не може да бъде оправдание за нереализирането на тази голяма политическа цел.

Надежда Йорданова, ДБ

Двете политически сили обаче се договориха да издигнат заедно кандидат за президент на изборите през есента на 2026 г. – фаворит е Гюров, и да се явят заедно на изборите за кмет на столичния район „Средец“, където отново ще се кандидатира Трайчо Трайков. Партиите няма да се разделят в общинските съвети, където имат общи групи.

Но ранното изявление на Николай Денков (ПП), че служебният премиер е обсъждан за кандидат за президент в ПП, не е добра услуга за Гюров. Анонсът изпревари процеса и превърна все още неформалния консенсус в тема за вътрешнопартийни съмнения и съревнование. 

Лидерът на ПП Асен Василев обоснова раздялата идеологически, тъй като „Промяната“ била центристка партия, а не дясна. Така на петата година от създаването ѝ и онази фраза за постигане на „леви цели с десни мерки“, доктриналните различия се оказаха препъникамък в съвместното съществуване. Василев не казва „леви“, макар че лявото политическо гнездо в България отдавна е опразнено и още никой не е снесъл яйце там.

Евродепутатът Никола Минчев единствен от Националния съвет на ПП определи като „дълбоко погрешно“ решението за разделянето. В социалните мрежи той написа, че е важно коалицията да остане сплотена предвид абсолютното мнозинство на Румен Радев и предстоящите избори за президент. 

Пред bTV обаче лидерът на ПП Асен Василев определи момента като еволюционен:

На всички хора стана ясно, че големите задачи – влизането в еврозоната и Шенген, и Борисов и Пеевски с под 80 депутати – са изпълнени. Сега на дневен ред идва следващата голяма задача, която е българските граждани да живеят по-добре и България да стане по-богата държава. Това е икономическият и социалният модел на страната, а там с „Демократична България“ имаме различни визии, различни икономически философии. Така че това е естествен преход и еволюция напред. 

Но еволюцията не е прогрес за всички, тя без колебание изтрива онези, които не се приспособяват. В природата се нарича естествен отбор, а в политиката минава за „стратегическо решение“. Следващите месеци ще покажат кои ще бъдат динозаврите.

Introducing Dynamic Workflows: durable execution that follows the tenant

Post Syndicated from Dan Lapid original https://blog.cloudflare.com/dynamic-workflows/

When we first launched Workers eight years ago, it was a direct-to-developers platform. Over the years, we have expanded and scaled the ecosystem so that platforms could not only build on Workers directly, but they could also enable their customers to ship code to us through many multi-tenant applications. We now see on Workers: Applications where users describe what they want, and the AI writes the implementation. Multi-tenant SaaS where every customer’s business logic is, at runtime, some TypeScript the platform has never seen before. Agents that write and run their own tools. CI/CD products where every repo defines its own pipeline.

Last month, when we shipped the Dynamic Workers open beta, we gave those platforms a clean primitive for the compute side: hand the Workers runtime some code at runtime, get back an isolated, sandboxed Worker, on the same machine, in single-digit milliseconds. Durable Object Facets extended the same idea to storage — each dynamically-loaded app can have its own SQLite database, spun up on demand, with the platform sitting in front, as a supervisor. Artifacts did the same for source control: a Git-native, versioned filesystem you can create by the tens of millions, one per agent, one per session, one per tenant. So, we have dynamic deployment for storage and source control. What’s next?

Today, we are bridging durable execution and dynamic deployment with Dynamic Workflows.

The gap between durable and dynamic execution

Cloudflare Workflows is our durable execution engine. It turns a run(event, step) function into a program where every step survives failures, can sleep for hours or days, can wait for external events, and resumes exactly where it left off when the isolate is recycled. It’s the right primitive for anything that has to “keep going” past a single request: onboarding flows, video transcoding pipelines, multi-stage billing, long-running agent loops, and — as of Workflows V2 — up to 50,000 concurrent instances and 300 new instances per second per account, redesigned for the agentic era.

But Workflows has always had one assumption baked in: the workflow code is part of your deployment. Your wrangler.jsonc has a block that says “when the engine calls into WORKFLOWS, run the class called MyWorkflow.” One binding, one class. Per deploy.

That works fine if you own all the code. It’s fine if you’re running a traditional application.

It stops working the moment you want to let your customer ship their workflow.

Say you’re building an app platform where the AI writes TypeScript for every tenant. Say you’re running a CI/CD product where each repository has its own pipeline. Say you’re using an agents SDK where each agent writes its own durable plan. In every one of these cases, the workflow is different for every tenant, every agent, every request. There is no single class to bind.

This is the same shape of problem that Dynamic Workers solved for compute and that Durable Object Facets solved for storage. We just hadn’t solved it for durable execution yet.

Dynamic Workflows

@cloudflare/dynamic-workflows is a small library. Roughly 300 lines of TypeScript. It lets a single Worker — the Worker Loader — route every create() call to a different tenant’s code, and, critically, have the Workflows engine dispatch run(event, step) back to that same code when the workflow actually executes, seconds or hours or days later.

Here’s the whole pattern. A Worker Loader:

import {
  createDynamicWorkflowEntrypoint,
  DynamicWorkflowBinding,
  wrapWorkflowBinding,
} from '@cloudflare/dynamic-workflows';

// The library looks this class up on cloudflare:workers exports.
export { DynamicWorkflowBinding };

function loadTenant(env, tenantId) {
  return env.LOADER.get(tenantId, async () => ({
    compatibilityDate: '2026-01-01',
    mainModule: 'index.js',
    modules: { 'index.js': await fetchTenantCode(tenantId) },
    // The tenant sees this as a normal Workflow binding.
    env: { WORKFLOWS: wrapWorkflowBinding({ tenantId }) },
  }));
}

// Register this as class_name in wrangler.jsonc.
export const DynamicWorkflow = createDynamicWorkflowEntrypoint<Env>(
  async ({ env, metadata }) => {
    const stub = loadTenant(env, metadata.tenantId);
    return stub.getEntrypoint('TenantWorkflow');
  }
);

export default {
  fetch(request, env) {
    const tenantId = request.headers.get('x-tenant-id');
    return loadTenant(env, tenantId).getEntrypoint().fetch(request);
  },
};

Add to your wrangler.jsonc:

"workflows": [
		{
			"name": "dynamic-workflow",
			"binding": "WORKFLOW",
			"class_name": "DynamicWorkflow"
		}
	]

The tenant writes plain, idiomatic Workflows code. They have no idea they’re being dispatched:

import { WorkflowEntrypoint } from 'cloudflare:workers';

export class TenantWorkflow extends WorkflowEntrypoint {
  async run(event, step) {
    return step.do('greet', async () => `Hello, ${event.payload.name}!`);
  }
}

export default {
  async fetch(request, env) {
    const instance = await env.WORKFLOWS.create({ params: await request.json() });
    return Response.json({ id: await instance.id });
  },
};

That’s it. The tenant calls env.WORKFLOWS.create(...) against what looks like a perfectly normal Workflow binding. Workflow IDs, .status(), .pause(), retries, hibernation, durable steps, step.sleep('24 hours'), step.waitForEvent() — everything works the way it always has.

The library handles one thing: making sure that when the Workflows engine eventually wakes up and calls run(event, step), it ends up inside the right tenant’s code.

How it works

Three layers: the Workflows engine (platform) on top, your Worker Loader in the middle, your tenant’s code (a Dynamic Worker) on the bottom. 


When a request reaches the Worker Loader, it routes the execution to the correct dynamic code on the fly. The rest of the execution is a handoff between these three layers, left-to-right in time: the request enters, bounces up to the engine, is persisted, and later bounces back down again.

Walking the flow:

① → ② Entering the tenant’s code. The Worker Loader receives an HTTP request, figures out which tenant it’s for, loads that tenant’s code via the Worker Loader, and forwards the request to its default.fetch. The env it hands the tenant contains WORKFLOWS: wrapWorkflowBinding({ tenantId }). As far as the tenant is concerned, that looks and acts like a real Workflow binding.

③ Up to the Worker Loader. When the tenant calls env.WORKFLOWS.create({ params }), it’s actually making a Remote Procedure Call (RPC) into the Worker Loader — the wrapped binding is a WorkerEntrypoint subclass (DynamicWorkflowBinding) that the runtime specialized with the tenant’s metadata at load time. That’s why you have to export { DynamicWorkflowBinding } from your Worker Loader: the runtime builds per-tenant stubs by looking the class up in cloudflare:workers exports. Bindings that cross the Dynamic Worker boundary have to be RPC stubs — a plain { create, get } object can’t be structured-cloned, and the raw Workflow binding isn’t serializable either.

Inside the Worker Loader, the wrapped binding transparently rewrites the payload:

tenant calls:  create({ params: { name: 'Alice' } })
                            │
                            ▼
engine sees:   create({ params: {
                  __workerLoaderMetadata: { tenantId: 't-42' },
                  params: { name: 'Alice' }
               }})

④ Up to the engine. The Worker Loader then calls .create() on the real WORKFLOWS binding with the envelope as the params. From here the Workflows engine takes over. It persists event.payload — which now includes the envelope — and schedules the run. Every time the engine later wakes up the workflow (whether that’s after a 24-hour sleep, a crash, or a deploy), the metadata rides along with the payload, waiting to route the run.

One implication: treat the metadata as a routing hint, not as authorization. The tenant can read it back via instance.status(). Don’t put secrets in there.

⑤ → ⑥ The engine comes back down. When the engine is ready to run a step, it calls .run(event, step) on the class you registered in wrangler.jsonc — the one createDynamicWorkflowEntrypoint gave you. That class unwraps the envelope, hands the metadata to the loadRunner callback you wrote, and forwards the unwrapped event through to whatever runner the callback returns.

The callback is where everything interesting happens, and it’s entirely yours. Fetch the tenant’s latest source from R2. Check their plan tier and pick a region. Attach a tail Worker for per-tenant logging. Bundle TypeScript on the fly with @cloudflare/worker-bundler. In the common case, you just hand off to the Worker Loader:

const stub = env.LOADER.get(tenantId, () => loadTenantCode(tenantId));
return stub.getEntrypoint('TenantWorkflow');

The Worker Loader caches by ID, so a workflow that runs many steps over many hours reuses the same dynamic Worker across them. When the isolate eventually gets evicted, the next step.do() pulls the code again and keeps going — the tenant’s workflow has no idea anything happened. A Dynamic Worker boots in single-digit milliseconds using a few megabytes of memory, so the dispatch overhead is essentially free. You can have a million tenants, each with their own distinct workflow code, each spun up lazily on the step boundary where it’s needed, and none of them cost anything while idle.

The escape hatch

If you want to subclass WorkflowEntrypoint yourself — to add logging around run(), wire up per-tenant observability, or thread custom state through — the library exposes the lower-level dispatchWorkflow primitive that createDynamicWorkflowEntrypoint is built on:

import { dispatchWorkflow } from '@cloudflare/dynamic-workflows';

export class MyDynamicWorkflow extends WorkflowEntrypoint {
  async run(event, step) {
    return dispatchWorkflow(
      { env: this.env, ctx: this.ctx },
      event,
      step,
      ({ metadata, env }) => loadRunnerForTenant(env, metadata),
    );
  }
}

Everything else — IDs, pause/resume, sendEvent, retries — falls through to the real Workflows engine untouched.

Dynamic Workers are the primitive

Step back from the specifics for a second. Every interesting line of this library is either a wrapper around .create() on the outbound side or a wrapper around WorkflowEntrypoint on the inbound side. The actual work — spinning up the tenant’s code, sandboxing it, routing RPC across the boundary, caching the isolate, hibernating between steps — is all done by Dynamic Workers underneath.

That’s the real story, and it’s a lot bigger than Workflows

Dynamic Workers is the primitive that swallows everything. Durable Object Facets is the same pattern applied to Durable Objects. Dynamic Workflows is that same pattern applied to WorkflowEntrypoint. Each one is the same small amount of envelope-and-unwrap glue between the static binding you’ve always had and the dynamic version you can now hand to your customers.

And we’re not stopping at Workflows. Every binding that Workers currently exposes is heading for a dynamic counterpart — queues where each producer ships its own handler, caches, databases, object stores, AI bindings, and MCP servers where every tenant brings their own tools. Whatever you bind to a Worker today, you will soon be able to bind dynamically: dispatched per tenant, per agent, per request, at zero idle cost.

The unit economics of running a platform like this are, frankly, absurd. Shipping a multi-tenant product used to mean giving every customer their own container, their own database, their own disk, their own scheduler, and stitching it together with orchestration glue, service meshes, and hair-pulling billing math. Many of these applications have to support thousands of customers at the very least; millions, at the most. On Dynamic Workers and everything composing on top of them, idle tenants cost approximately nothing and active tenants share the same hardware through isolate-level multi-tenancy. The floor drops several orders of magnitude. A platform that used to cap out at thousands of paying customers can now reasonably serve tens of millions.

What this unlocks

Agent platforms that plan like engineers

Coding agents — OpenCode, Claude Code, Codex, Pi — have been proving for the past year that LLMs are far better at writing code than at making sequential tool calls. The Cloudflare Agents SDK and Project Think extend that insight into durable execution: with primitives like fibers and sub-agents, an agent’s long-running plan can survive crashes, hibernation, and redeploys without the user noticing.

Dynamic Workflows is the piece that lets that plan be a first-class Cloudflare Workflow — something the agent literally writes and the platform literally runs, with the full durability machinery behind it. A run(event, step) function the model wrote a minute ago, where every step.do(...) is independently retryable, every step.sleep('24 hours') hibernates for free, and every step.waitForEvent(...) waits indefinitely for the human to approve the next action. The agent writes the workflow; the platform runs it; neither has to know ahead of time what the plan looks like.

SDKs and frameworks where the user brings the logic

If you’re shipping a framework where your customer writes the run(event, step) function — a workflow builder UI, a visual automation tool, a per-tenant extension system, a low-code tool for non-developers — Dynamic Workflows is now the primitive that makes it work without compromise. You call wrapWorkflowBinding({ tenantId }) once, hand the result to their code as WORKFLOWS, and every workflow instance they create is automatically tagged, routed back, and executed in their sandbox. The framework owns the Worker Loader; the user owns the workflow; neither has to care about the other.

CI/CD at primitive speed

Here’s the use case that’s been getting us most excited.

Every CI/CD platform in existence is, underneath, a dispatcher of per-repo configuration files: “run these steps, in this order, with these secrets, cache these directories, upload these artifacts.” Each repo has its own pipeline. Each branch might have its own variant. Each pull request spawns an instance of that pipeline that has to run to completion, survive a machine crash, retry a flaky step, stream logs, pause for approvals, and persist results.

That’s exactly the shape of a durable workflow. The reason CI hasn’t been built that way until now is that nobody had a cloud primitive where the workflow itself is different for every repo, dispatched at runtime, at zero provisioning cost. Now you do.

Here’s what a CI pipeline looks like when it’s just code your customer ships with their repo — say, in .cloudflare/ci.ts. The workflow itself is real; the runInSandbox() / summarise() / GitHub binding helpers below are platform-provided glue, the kind of thing you’d ship once in your dispatcher:

import { WorkflowEntrypoint } from 'cloudflare:workers';

export class CIPipeline extends WorkflowEntrypoint {
  async run(event, step) {
    const { repo, sha, branch, pr } = event.payload;

    // Fork an isolated copy of the repo at this commit. Seconds, not minutes.
    const workspace = await step.do('checkout', () =>
      this.env.ARTIFACTS.fork(repo, { sha })
    );

    await step.do('install', () => runInSandbox(workspace, ['pnpm', 'install']));

    // Each parallel step is independently retryable.
    const [lint, test, build] = await Promise.all([
      step.do('lint',  () => runInSandbox(workspace, ['pnpm', 'lint'])),
      step.do('test',  () => runInSandbox(workspace, ['pnpm', 'test'])),
      step.do('build', () => runInSandbox(workspace, ['pnpm', 'build'])),
    ]);

    if (pr) {
      await step.do('comment', () =>
        this.env.GITHUB.commentOnPR(repo, pr, summarise({ lint, test, build }))
      );
    }

    // Workflow hibernates until approval arrives. No VM held open.
    if (branch === 'main') {
      await step.waitForEvent('approval', { type: 'deploy-approval', timeout: '24 hours' });
      await step.do('deploy', () => runInSandbox(workspace, ['pnpm', 'deploy']));
    }
  }
}

The platform owns the dispatcher. It ingests a webhook, figures out which repo it came from, loads that repo’s CIPipeline class as a Dynamic Worker, and hands the run-off to Dynamic Workflows. The platform doesn’t know what’s in the pipeline. It doesn’t need to. It’s running a durable function that happens to live in the customer’s repo.

Now line up what each step actually does:

  • Artifacts gives every repo a Git-native, versioned filesystem that lives on Cloudflare’s globally distributed network. ArtifactFS hydrates the tree lazily, so even a multi-GB repo is ready to work within single-digit seconds — and fork() gives each CI run its own isolated copy, with no git clone tax.

  • Dynamic Workers run each lightweight step (lint, format, typecheck, bundle) in a sandboxed isolate that boots in milliseconds, on the same machine as the repo’s data. No VM provisioning, no image pull, no cold start.

  • Dynamic Workflows holds the whole run together. Steps are retryable and durable. The run hibernates for free while waiting on approvals. State and progress survive deploys, evictions, and crashes.

  • Sandboxes handle the heavy corners — the step that needs docker build, the integration suite that needs Postgres running, the Rust compile that needs 8 cores. Snapshots to R2 mean even those warm-start in a couple of seconds.

A traditional CI run for a mid-sized JS repo looks something like: allocate VM (15-30s) → pull base image (10s) → git clone (10s) → npm ci (30-60s) → run tests (actual work) → tear down. Several minutes of ceremony before the first test runs, and you pay for the whole VM the whole time.

The same pipeline on this stack looks like: edge fork of the repo (seconds) → each step boots a fresh isolate or snapshot-restored sandbox in milliseconds → runs the actual work → hibernates. Nothing has to cold-start. Nothing has to be provisioned ahead of time. Nothing has to be kept warm. The repo doesn’t move — the compute comes to it.

CI has never been this fast, and the reason it hasn’t is that none of these primitives have existed together in one place. Now they do.

Try it

@cloudflare/dynamic-workflows is MIT-licensed and on npm today:

npm install @cloudflare/dynamic-workflows

It runs on top of Dynamic Workers, which is in open beta on the Workers Paid plan. The repo includes a working example — an interactive browser playground where you write a TenantWorkflow class, hit Run, and watch the steps execute with live-streaming logs and a per-step checklist that lights up as each step.do() commits. Clone it, deploy it, show it to a coworker.

If you’re a platform, an SDK, a framework, or a CI/CD product, and you want to give your customers their own workflows without running their code in your own process: this is the primitive we built for you. If you’re building agents that write durable plans, this is the primitive that makes those plans real Workflows. If you’re just watching all of this, and it looks fun to build on top of: we’d love to see what you make.

Find us in the Cloudflare Developers Discord. We’ll be there all week.

Пол Линч: Да погледнем реалността в очите

Post Syndicated from Стефан Иванов original https://www.toest.bg/pol-linch-da-poglednem-realnostta-v-ochite/

Пол Линч: Да погледнем реалността в очите

Пол Линч е ирландски писател, носител на наградата „Букър“ за 2023 г. за романа си „Пророческа песен“ (изд. „Лист“, преводач Иглика Василева). На 25 април 2026 г. дискусията с него закри десетото издание на фестивала „Литературни срещи“, посветено на темата „Дистопии и съпротива“. Фестивалът се организира от Фондация „Прочети София“,

Романите Ви изследват как политическата катастрофа навлиза в най-интимните пространства на живота, в семейството, езика, паметта, тялото. Когато започвате да пишете книга, от политическа интуиция за света ли тръгвате, или от по-частен емоционален пейзаж, който постепенно разкрива политическите си измерения?

Трябва да Ви поправя за нещо важно. Не съм политически писател. Не смятам книгите си за политическа проза. Единствената, която може донякъде да отговори на тази заявка, е „Пророческа песен“. Останалите са метафизични текстове. Смятам себе си за метафизичен романист. Сериозната проза според мен има задължението да мисли за проблема на реалността в пълния му обхват. А реалността е безкрайно сложна. Безкрайно сложната реалност за човешките същества включва политическото. Но политическото не включва безкрайната сложност. Не е обратното. Роман като „Пророческа песен“ има политическо измерение, но има и много други. Цялата ми проза има един основен план – да мисли върху проблема за смисъла на човешкото същество в неотчуждаема вселена. Всичките ми герои страдат, желаят нещо същностно, като чувство за достойнство и усещане за повече признание. Винаги са хванати в нещо екзистенциално, космическо, политическо, нещо, което подсказва липса на свободна воля, липса на индивидуалност в свят, който не ги разпознава.

Същевременно има и философско измерение: как създаваме смисъл в свят, който не ни разпознава? Как интерпретираме кои сме, когато светът около нас мълчи? Има го това усещане за възвишен ужас, старомодното значение на възвишеното, нещо неизразимо, което ни подхвърля наоколо като прашинки. Когато романът зрее, това често се случва подсъзнателно. Имам ситуация или проблем, който ме гризе, и причината постоянно да се връща е, че говори за нещо универсално. Книгите ми изглеждат като прости разкази за изпитания, но изобщо не са прости. В тях има слоеве и пластове.

Когато за пръв път прелистих „Пророческа песен“, образът, само визуален, който се появи, беше за непрекъснатите от нови параграфи страници на Томас Бернхард. А когато споменахте възвишеното, първата ми асоциация беше с морето. Морето във Вашето писане е доста важно. На възвишеното ли е образ, или на възможност, на надежда? Имам предвид и финала на „Пророческа песен“.

Не можем да говорим за финала. Всъщност е сложно да се говори за морето във връзка с „Пророческа песен“. Но мога да говоря за „Отвъд морето“, ако искате.

Да, разбира се.

В този роман морето не е точно море. То се превръща в нещо космическо. То е великото мълчание около нас. Великото безразличие на вселената. Празнотата, която ни гледа в очите, когато наистина се вгледаме в реалността на нещата. Двама мъже в лодка, опитващи се да създадат смисъл за себе си, когато би трябвало да са мъртви или ще умрат със сигурност. Морето отново действа като форма на възвишеното, то е ужасът от онова, което лежи отвъд нас, което не знаем и което не можем съвсем да разчетем. Когато излезем от собствената си индивидуалност, от тесния си фокус на внимание, срещаме нещо по-обширно, нещо космическо. Това космическо измерение е много важно за мен, то ни поставя в по-обширен контекст. Обичам писатели, които винаги са правили това, като Достоевски, Мелвил, Фокнър, Конрад. Писатели с космическо измерение, способни да създадат образи и мащаб, да те погледнат с космическо око от небето и в същото време да се доближат максимално до героите и да артикулират текстурата на преживяната реалност. Мащабът е това, което ме интересува. Не е обичайно в съвременната проза, но мисля, че трябва да картографираме параметрите на реалното, доколкото можем.

Реалното с главно Р?

Да, точно.

Много читатели преживяват творчеството Ви почти физически. Прозата се движи като дълъг, непрекъснат дъх или поток, създавайки усещане за натиск и неизбежност. Този стилистичен интензитет Ваш начин ли е да пресъздадете психологическата атмосфера на живеенето вътре в историята?

Изречението е фундаментално. Когато пиша, изречението трябва да съдържа преживяната реалност на момента в текста, може да подчертава познатото, но може и непознатото. „Пророческа песен“ е написана в сегашно време, за да предизвика чувството за онова, което не може да бъде познато. Сегашното време е винаги среща и с непознатото. Бъдещето не може да бъде познато. Срещаме го, докато се разгръща. Айлиш е хваната в нещо бързо, непроницаемо и с ужасяваща енергия. Изреченията трябва да създават чувство на страх и клаустрофобия в момент, който не можеш да прoумееш напълно. Затова са дълги – защото в реалността няма точка. Реалността се движи и диша. Не пиша трудни изречения. Не правя като Краснахоркаи, при когото дългите изречения имат много различна роля. Дългото изречение на Бернхард е много различно от моето. И да, няма прекъсвания за абзаци, текстът оформя читателския опит. Принуждава го да е в момента. Няма бяло пространство, защото за Айлиш Стак няма къде да си поеме дъх. Има я само инерцията на онова, което се разгръща. Вирджиния Улф е говорила за моменти в писането, когато има навлизане в реалността без нормалното его. Искам Айлиш да го преживее. Искам и ние да го преживеем.

Нейното тунелно зрение.

Да. Когато си в него, започваш сам да усещаш Айлиш. Този роман произвежда радикална емпатия, позволява ти да влезеш напълно в пространството, космическото съзнание, преживения момент на друг герой. Това е идеята на прозата. Магическа е.

Буквално е така.

В Силициевата долина говорят за изобретяване на все по-добра виртуална реалност. А ние, по дяволите, я изобретихме преди векове. Казва се проза.

И парадоксът с виртуалната реалност е парадоксът на картата и територията. Невъзможна е. Но… няма да задавам повече политически въпроси.

Но може да опитате – писането ми има политически измерения.

На битово ниво съпротивата рядко изглежда героична. Може да приеме формата на малки действия, на отказ от мълчание, защита на друг човек, съхраняване на езика, казване на истината. Какви ежедневни жестове помагат на хората да се съпротивляват на нормализирането на страха и контрола?

Интересно е, защото предишният журналист зададе много подобен въпрос. Идеята за съпротивата нещо важно ли е точно сега в България?

Да. В момента имаме мнозинство на прокремълска партия в парламента.

Мисля, че задължението на индивида днес е да се съпротивлява на завладяването и поробването на ума ни от технологията, за която всички сме се подписали, без никому да са обяснили условията на договора. Да се съпротивляваме на навлизането на технологиите в индивидуалността ни. Това важно нещо може да включва и прозата, както и създаването на пространство за тишина. От тях идва истинската индивидуалност. Когато чуеш този шепот, тихия шепот на Аза, автентичността става неизбежна. Автентичният Аз е мощна сила. Ще се съпротивлява на онова, което пречи на свободата му да съществува.

Ефективен отговор. И нужен.

Ние бяхме неутрализирани от айфона. Без значение дали става въпрос да се съпротивляваш политически, или да се ангажираш философски с проблема на смисъла, или просто да присъстваш в живота си, ние бяхме завладени и неутрализирани от технологията около нас. Това прави автокрацията по-лесна, защото корумпира реалността. Всичко, което имаме вътре, е този много тих и чист сигнал на висшия Аз. Не говоря мистически, говоря психологически – това е онзи Аз, който стига до проблема на смисъла, на това как да живееш и кой да бъдеш в света. Не всичко е политическо. Когато Робинзон Крузо отива на пустия остров, среща аспект на Аза извън политиката, извън икономиката, директно конфронтира смисъла си в космоса. Този аспект на ума го има у всички нас, но модерният живот го е отчуждил от нас. Вече нямаме структурите на смисъла от религията. Какви структури на смисъла имаме? Екзистенциалистите владееха този разговор през ХХ век. Но къде е сега въпросният диалог? Не го чувам. Трябва да започнем оттам и да се ориентираме автентично, преди да се захванем със света.

Писателите често говорят за отчаянието като творческа сила, но Вашето творчество носи едно упорито чувство за човешко достойнство. Какво поддържа собственото Ви усещане за надежда? Когато пишете за мрачни исторически възможности, какво лично Ви помага?

Тук се стига до ядрото на това какво представлявамe. В центъра на човешкото същество има гордиев възел, вътре в мен и във Вас има вселена от чувства, вселена от възможности и едно дълбоко усещане за страдание – винаги, защото то е неизбежно, то е състоянието ни. Имаме безкрайно въображение в себе си, но краен живот. Свeтът е без смисъл, ако живееш извън религиозна структура и трябва сам да го създаваш. Чувствам какво е да бъда себе си, и ме е грижа. Бих искал достойнство, справедливост за семейството си, общността ми; искам свобода. В прозата изследвам напрежението на обективната сила, която не я е грижа. Затова има централен хуманизъм в писането ми, наред с празнотата, защото трябва да празнуваме човечността. „Трябва да признаем достойнството на човешкия дух“ – фразата е на Томас Ман. Ако си жив като човешко същество, имаш човешки дух. Това не е религиозна идея, това е усещането да си жив, да съзнаваш, че си човек в този свят. Длъжни сме да признаваме красотата на това. Ето защо не съм политически писател. Може писането ми да има политически измерения, но проектът ми е много по-обширен – в ядрото си е метафизика. Проектът на модерността е бил да се създаде индивидуалността. Вече я имаме. Какво ще правим с нея?

Ще я заличим?

Заличаваме я, пропиляваме я в разсейване и скролване на безкрайния абсурд по екраните. Заменихме старите символи, които ни даваха усещане за света, с шибаното скролване на колективното несъзнавано от боклуци на екрана. Безсмислено е. Ако не се опитаме да разрешим тези проблеми сега, новата теокрация ни чака от другата страна. Вече може да я чуете. Трябва отново да водим разговор за смисъла като общество.

Този разговор трябва да се води лице в лице. Това е истинският разговор, колкото и да е трудно да се състои в момента. Прав сте. Когато гледате настоящия момент, тревогата за климата, политическата тревога, крехките демокрации, войните, има ли конкретни произведения на изкуството, които Ви се струват значими днес? И обратно, към кои се обръщате, когато имате нужда от напомняне за издръжливостта и възможността за човешко обновление?

Мисля, че проблемът ни като общество е, че сме свели изкуството до забавление, а забавлението – до разсейване. Трябва отново да създадем пространство за сериозното изкуство, което задава въпроси и ни кара да мислим кои сме в света. Това е индивидуално нещо – да си оставиш телефона, да прочетеш книга. Изглежда трудно, но след стотина страници вече не е. Да възстановиш мускула, който се справя със сложността на литературата. Да изоставиш филмите на Marvel, които свеждат света до манихейско черно-бяло, и да прегърнеш сложността на изкуството, което казва, че животът е безкрайно велик. Като читател се връщам към текстове с максимална сложност, мащаб и визия. Обичам „Докато лежах и умирах“ на Фокнър, там е човешкото състояние в цялата му цялост. Имаме смърт, буря, хаос, къща на хълм. Архетипна яснота и какофония от гласове, в която никой не слуша никого. Всеки е индивид, заключен в собствената си вселена. Целият спектър от болка, глупост, страдание, алчност – всичко е там, в тази проста история. Устойчивостта идва от разпознаването на това какво сме – не от фалшива надежда, че всичко ще е наред, а от истината за живота. Инфантилизирахме реалността си и я анестезирахме. Скролваш и получаваш позитивни послания за самопомощ, които траят три секунди. Как ще изградиш живот от това? Джеймс Болдуин казва, че човешките същества са способни да носят голямо бреме, когато срещнат реалността. Оттам идва устойчивостта – от разпознаването на истината за живота. Затова чета проза. Затова сме тук – за да погледнем реалността в очите.

И да не се страхуваме.

Да.

Последен въпрос. Много бърз. Любим визуален артист, любим филм, любима песен?

Обичам толкова много неща. Колекционирам джаз плочи, слушам много джаз. Колекционирам филми.

Майлс Дейвис или Колтрейн?

Колтрейн. От съвременното кино обичам Ханеке; „Бялата лента“ е шедьовърът му, гледал съм го много пъти. Обичам Одзу, „Токийска история“ – извънредно хуманен филм. Харесвам Мизогучи. Слушам и прогметъл, обичам Mastodon, но слушам предимно джаз.

Кой е последният албум, който слушахте?

Magnificent на Бари Харис. Беше шокиращо добър. На летището го изслушах. Страхотен е, от 1970-та, със силно влияние от учителите му Бъд Пауъл и Монк. Съзнателно остава в тази линия в период, когато всички вече са отишли другаде. Нещо подобно правя и аз с писането си.

The collective thoughts of the interwebz