home.social

#idempotency — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #idempotency, aggregated by home.social.

  1. Idempotency keys: 5 граблей, которые мы поймали на проде

    Пятница, 23:47. PagerDuty: “Платёж AmEx, провайдер вернул 5xx три раза подряд, билеты не зарезервированы.” Открываю логи – действительно три ответа провайдера 5xx, ни одной успешной транзакции по нашей базе. Закрываю как временный сбой на стороне провайдера, пишу короткую сводку в дежурный чат и иду досматривать. Через 40 минут второй алерт – уже от ночной поддержки: клиент прислал скрин выписки, 3 списания подряд за одну бронь. У клиента рейс через 6 часов, ему нужна действующая бронь и подтверждение, что он завтра нормально улетит, а не тикет в поддержку. Мы делали B2B-платформу для деловых поездок: бронь авиа, отели, трансфер, страховка, в финале – оплата корпоративной картой через платежный шлюз. С этой ночи началась история, которая закончилась переписыванием всего платёжного слоя нашего booking-сервиса. По дороге мы поймали 5 граблей.

    habr.com/ru/articles/1039860/

    #идемпотентность #idempotency #платежи #распределённые_системы #NET #C# #API #intentkey #race_condition #грабли

  2. Idempotency keys: 5 граблей, которые мы поймали на проде

    Пятница, 23:47. PagerDuty: “Платёж AmEx, провайдер вернул 5xx три раза подряд, билеты не зарезервированы.” Открываю логи – действительно три ответа провайдера 5xx, ни одной успешной транзакции по нашей базе. Закрываю как временный сбой на стороне провайдера, пишу короткую сводку в дежурный чат и иду досматривать. Через 40 минут второй алерт – уже от ночной поддержки: клиент прислал скрин выписки, 3 списания подряд за одну бронь. У клиента рейс через 6 часов, ему нужна действующая бронь и подтверждение, что он завтра нормально улетит, а не тикет в поддержку. Мы делали B2B-платформу для деловых поездок: бронь авиа, отели, трансфер, страховка, в финале – оплата корпоративной картой через платежный шлюз. С этой ночи началась история, которая закончилась переписыванием всего платёжного слоя нашего booking-сервиса. По дороге мы поймали 5 граблей.

    habr.com/ru/articles/1039860/

    #идемпотентность #idempotency #платежи #распределённые_системы #NET #C# #API #intentkey #race_condition #грабли

  3. Idempotency keys: 5 граблей, которые мы поймали на проде

    Пятница, 23:47. PagerDuty: “Платёж AmEx, провайдер вернул 5xx три раза подряд, билеты не зарезервированы.” Открываю логи – действительно три ответа провайдера 5xx, ни одной успешной транзакции по нашей базе. Закрываю как временный сбой на стороне провайдера, пишу короткую сводку в дежурный чат и иду досматривать. Через 40 минут второй алерт – уже от ночной поддержки: клиент прислал скрин выписки, 3 списания подряд за одну бронь. У клиента рейс через 6 часов, ему нужна действующая бронь и подтверждение, что он завтра нормально улетит, а не тикет в поддержку. Мы делали B2B-платформу для деловых поездок: бронь авиа, отели, трансфер, страховка, в финале – оплата корпоративной картой через платежный шлюз. С этой ночи началась история, которая закончилась переписыванием всего платёжного слоя нашего booking-сервиса. По дороге мы поймали 5 граблей.

    habr.com/ru/articles/1039860/

    #идемпотентность #idempotency #платежи #распределённые_системы #NET #C# #API #intentkey #race_condition #грабли

  4. Idempotency keys: 5 граблей, которые мы поймали на проде

    Пятница, 23:47. PagerDuty: “Платёж AmEx, провайдер вернул 5xx три раза подряд, билеты не зарезервированы.” Открываю логи – действительно три ответа провайдера 5xx, ни одной успешной транзакции по нашей базе. Закрываю как временный сбой на стороне провайдера, пишу короткую сводку в дежурный чат и иду досматривать. Через 40 минут второй алерт – уже от ночной поддержки: клиент прислал скрин выписки, 3 списания подряд за одну бронь. У клиента рейс через 6 часов, ему нужна действующая бронь и подтверждение, что он завтра нормально улетит, а не тикет в поддержку. Мы делали B2B-платформу для деловых поездок: бронь авиа, отели, трансфер, страховка, в финале – оплата корпоративной картой через платежный шлюз. С этой ночи началась история, которая закончилась переписыванием всего платёжного слоя нашего booking-сервиса. По дороге мы поймали 5 граблей.

    habr.com/ru/articles/1039860/

    #идемпотентность #idempotency #платежи #распределённые_системы #NET #C# #API #intentkey #race_condition #грабли

  5. In a world where tech buzzwords collide with baffling logic, this article bravely declares that #idempotency is simple... until it isn't 🤦‍♂️. With more #contradictions than a politician's promises, it offers an unforgettable checklist to ensure your first request is your last. Move over rocket science, there's a new #complexity in town! 🚀
    blog.dochia.dev/blog/idempoten #techbuzzwords #softwaredevelopment #HackerNews #ngated

  6. In a world where tech buzzwords collide with baffling logic, this article bravely declares that #idempotency is simple... until it isn't 🤦‍♂️. With more #contradictions than a politician's promises, it offers an unforgettable checklist to ensure your first request is your last. Move over rocket science, there's a new #complexity in town! 🚀
    blog.dochia.dev/blog/idempoten #techbuzzwords #softwaredevelopment #HackerNews #ngated

  7. In a world where tech buzzwords collide with baffling logic, this article bravely declares that #idempotency is simple... until it isn't 🤦‍♂️. With more #contradictions than a politician's promises, it offers an unforgettable checklist to ensure your first request is your last. Move over rocket science, there's a new #complexity in town! 🚀
    blog.dochia.dev/blog/idempoten #techbuzzwords #softwaredevelopment #HackerNews #ngated

  8. In a world where tech buzzwords collide with baffling logic, this article bravely declares that #idempotency is simple... until it isn't 🤦‍♂️. With more #contradictions than a politician's promises, it offers an unforgettable checklist to ensure your first request is your last. Move over rocket science, there's a new #complexity in town! 🚀
    blog.dochia.dev/blog/idempoten #techbuzzwords #softwaredevelopment #HackerNews #ngated

  9. In a world where tech buzzwords collide with baffling logic, this article bravely declares that #idempotency is simple... until it isn't 🤦‍♂️. With more #contradictions than a politician's promises, it offers an unforgettable checklist to ensure your first request is your last. Move over rocket science, there's a new #complexity in town! 🚀
    blog.dochia.dev/blog/idempoten #techbuzzwords #softwaredevelopment #HackerNews #ngated

  10. #Idempotency: What, Why & How — deep dive into safe retries in #Laravel

    🔁 #PHP #API #backend

    🤔 What is #idempotency? An operation that can be called multiple times while producing the same final effect as calling it once — critical when clients retry failed requests

    ⚠️ Without idempotency, retries can cause: duplicate orders, double payments, repeated webhook processing, multiple subscription changes & inconsistent audit trails

    🧵 👇

  11. State machine design enforces idempotency in financial workflows. Business records hold an explicit state field, and transitions follow predefined rules. Repeated operations on an already-transitioned state produce no additional change.

    #Idempotency #Fintech #SystemDesign

  12. Idempotency keys are unique identifiers attached to payment requests. They allow clients to safely retry failed or timed-out requests, as the server uses the key to detect and deduplicate repeat submissions.

    #Idempotency #PaymentSystems #Fintech

  13. Idempotency keys are unique identifiers attached to payment requests. They allow clients to safely retry failed or timed-out requests, as the server uses the key to detect and deduplicate repeat submissions.

    #Idempotency #PaymentSystems #Fintech

  14. Idempotency keys are unique identifiers attached to payment requests. They allow clients to safely retry failed or timed-out requests, as the server uses the key to detect and deduplicate repeat submissions.

    #Idempotency #PaymentSystems #Fintech

  15. Participants in orchestrated sagas must be idempotent: executing the same command more than once must produce the same result. This is required because the orchestrator may retry commands after transient failures.

    #Orchestration #Idempotency #Microservices

  16. At-least-once. Это не баг провайдера. Это ваша архитектурная проблема

    Думал, зайду в крипту и буду просто дёргать API блокчейна. Не вышло. Захожу в проект. Стек: FastAPI, PostgreSQL, Redis как Celery broker, Celery workers, Docker, Web3. Стартап на хайпе, деньги реальные, архитектура собрана на коленке. Смотрю на архитектуру платёжного процессинга и первая мысль: ребята, вы серьёзно? Финансовые операции с реальными деньгами, без idempotency вообще, Redis как брокер без persistence, Web3.py синхронные вызовы внутри Celery тасков. Разговор был короткий: задача такая, чини что есть. Сроки горели.

    habr.com/ru/articles/1028708/

    #idempotency #PostgreSQL #Celery #FastAPI #Redis #atleastonce #webhook #distributed_systems #финтех

  17. At-least-once. Это не баг провайдера. Это ваша архитектурная проблема

    Думал, зайду в крипту и буду просто дёргать API блокчейна. Не вышло. Захожу в проект. Стек: FastAPI, PostgreSQL, Redis как Celery broker, Celery workers, Docker, Web3. Стартап на хайпе, деньги реальные, архитектура собрана на коленке. Смотрю на архитектуру платёжного процессинга и первая мысль: ребята, вы серьёзно? Финансовые операции с реальными деньгами, без idempotency вообще, Redis как брокер без persistence, Web3.py синхронные вызовы внутри Celery тасков. Разговор был короткий: задача такая, чини что есть. Сроки горели.

    habr.com/ru/articles/1028708/

    #idempotency #PostgreSQL #Celery #FastAPI #Redis #atleastonce #webhook #distributed_systems #финтех

  18. At-least-once. Это не баг провайдера. Это ваша архитектурная проблема

    Думал, зайду в крипту и буду просто дёргать API блокчейна. Не вышло. Захожу в проект. Стек: FastAPI, PostgreSQL, Redis как Celery broker, Celery workers, Docker, Web3. Стартап на хайпе, деньги реальные, архитектура собрана на коленке. Смотрю на архитектуру платёжного процессинга и первая мысль: ребята, вы серьёзно? Финансовые операции с реальными деньгами, без idempotency вообще, Redis как брокер без persistence, Web3.py синхронные вызовы внутри Celery тасков. Разговор был короткий: задача такая, чини что есть. Сроки горели.

    habr.com/ru/articles/1028708/

    #idempotency #PostgreSQL #Celery #FastAPI #Redis #atleastonce #webhook #distributed_systems #финтех

  19. At-least-once. Это не баг провайдера. Это ваша архитектурная проблема

    Думал, зайду в крипту и буду просто дёргать API блокчейна. Не вышло. Захожу в проект. Стек: FastAPI, PostgreSQL, Redis как Celery broker, Celery workers, Docker, Web3. Стартап на хайпе, деньги реальные, архитектура собрана на коленке. Смотрю на архитектуру платёжного процессинга и первая мысль: ребята, вы серьёзно? Финансовые операции с реальными деньгами, без idempotency вообще, Redis как брокер без persistence, Web3.py синхронные вызовы внутри Celery тасков. Разговор был короткий: задача такая, чини что есть. Сроки горели.

    habr.com/ru/articles/1028708/

    #idempotency #PostgreSQL #Celery #FastAPI #Redis #atleastonce #webhook #distributed_systems #финтех

  20. The SharePoint Architect’s Secret: Programmatic Deployment

    2,131 words, 11 minutes read time.

    If you are still clicking “New List” in a SharePoint production environment, you aren’t an architect; you’re a hobbyist playing with a high-stakes enterprise tool. You might think that manual setup is “faster” for a small SPFx project, but you are actually just leaking technical debt into your future self’s calendar.

    Every manual click is a variable you didn’t account for, a point of failure that will inevitably crash your web part when a user renames a column or deletes a choice. Real developers don’t hope the environment is ready—they command it to be ready through code that is as immutable as a compiled binary.

    The hard truth is that most SPFx “experts” are actually just CSS skinners who are terrified of the underlying REST API and the complexity of PnPjs. They build beautiful interfaces on top of shaky, manually-created schemas that crumble the moment the solution needs to scale or move to a different tenant.

    If your deployment process involves a PDF of “Manual Setup Instructions” for an admin, you have already failed the first test of professional engineering: repeatability. Your job isn’t to make it work once; it’s to ensure it can never work incorrectly, no matter who is at the keyboard.

    We are going to break down the two primary schools of thought in programmatic provisioning: the legacy XML “Old Guard” and the modern PnPjs “Fluent” approach. Both have their place in the trenches, but knowing when to use which is what separates the senior lead from the junior dev who just copies and pastes from Stack Overflow.

    Consistency is the only thing that saves you when the deployment window is closing and the client is breathing down your neck. If you don’t have a script that can “Ensure” your list exists exactly as the code expects it, you are just waiting for a runtime error to ruin your weekend.

    The Blueprint: Our Target “Project Contacts” List

    Before we write a single line of provisioning code, we define the contract. Our SPFx web part expects a list named “ProjectContacts” with the following technical specifications:

    • Title: (Standard) The person’s Full Name.
    • EmailAddr: (Text) Their primary corporate email.
    • MailingAddress: (Note/Multiline) The full street address.
    • City: (Text) The shipping/mailing city.
    • IsActive: (Boolean) A toggle to verify if this contact is still valid.
    • LinkedInProfile: (URL) A link to their professional profile.

    If any of these internal names are missing or mapped incorrectly, your SPFx get request will return a 400 Bad Request, and your UI will render as a broken skeleton.

    Method A: The XML Schema (The “Old Guard” Precision)

    Most juniors look at a block of SharePoint XML and recoil like they’ve seen a memory leak in a legacy C++ driver. They want everything to be clean JSON or fluent TypeScript because it’s easier to read, but they forget that SharePoint’s soul is still written in that rigid, unforgiving XML.

    When you use createFieldAsXml, you are speaking the native language of the SharePoint engine. This bypasses the abstractions that sometimes lose detail in translation. This isn’t about being “old school”; it’s about precision. A field’s InternalName is its DNA—if you get it wrong, the entire system rejects the transplant.

    I’ve seen dozens of SPFx projects fail because a developer relied on a Display Name that changed three months later, breaking every query in the solution. By using the XML method, you hard-code the StaticName and ID, ensuring that no matter what a “Site Owner” does in the UI, your code remains functional.

     // The Veteran's Choice: Precision via XML  const emailXml = `<Field Type="Text" Name="EmailAddr" StaticName="EmailAddr" DisplayName="E-Mail Address" Required="TRUE" />`;  const addressXml = `<Field Type="Note" Name="MailingAddress" StaticName="MailingAddress" DisplayName="Mailing Address" Required="FALSE" RichText="FALSE" />`;   await list.fields.createFieldAsXml(emailXml);  await list.fields.createFieldAsXml(addressXml); 

    Using XML is a choice to be the master of the metadata, rather than a passenger on the SharePoint UI’s whims. It requires a level of discipline that most developers lack because you have to account for every attribute without a compiler to hold your hand. If your personal “schema” is well-defined and rigid, you can handle the pressure of any deployment. If it’s loose, you’re just waiting for a runtime crash.

    Method B: The Fluent API (The Modern “Clean Code” Protocol)

    If Method A is the raw assembly, Method B is your high-level compiled language. The PnPjs Fluent API is designed for the developer who values readability and speed without sacrificing the “Ensure” logic required for professional-grade software.

    Instead of wrestling with strings and angle brackets, you use strongly-typed methods. This is where the modern architect lives. It reduces the “surface area” for errors. You aren’t guessing if you closed a tag; the IDE tells you if your configuration object is missing a required property. This is the “Refactored” life—eliminating the noise so you can focus on the logic.

     // The Modern Protocol: Type-Safe Fluent API  await list.fields.addText("City", {      Title: "City",      Required: false  });   await list.fields.addBoolean("IsActive", {      Title: "Is Active",      DefaultValue: "1" // True by default  });   await list.fields.addUrl("LinkedInProfile", {      Title: "LinkedIn Profile",      Required: false  }); 

    The “Fluent” way mirrors a man who has his protocols in place. You don’t have to over-explain; the code speaks for itself. It’s clean, it’s efficient, and it’s easily maintained by the next guy on the team. But don’t let the simplicity fool you—you still need the “Check-then-Create” logic (Idempotency) to ensure your script doesn’t blow up if the list already exists.

    The Idempotency Protocol: Building Scripts That Don’t Panic

    In the world of high-stakes deployment, “hope” is not a strategy. You cannot assume the environment is a blank slate. Maybe a junior dev tried to “help” by creating the list manually. Maybe a previous deployment timed out halfway through the schema update. If your code just tries to add() a list that already exists, it will throw a 400 error and crash the entire initialization sequence of your SPFx web part.

    Professional engineering requires Idempotency—the ability for a script to be run a thousand times and yield the same result without side effects. Your code needs to be smart enough to look at the site, recognize what is already there, and only provision the delta. This is where you separate the “script kiddies” from the architects. You aren’t just writing a “Create” script; you are writing an “Ensure” logic.

     // The Architect's Check: Verify before you Commit  try {      await sp.web.lists.getByTitle("ProjectContacts")();      console.log("Infrastructure verified. Proceeding to field check.");  } catch (e) {      console.warn("Target missing. Initializing Provisioning Protocol...");      await sp.web.lists.add("ProjectContacts", "Centralized Stakeholder Directory", 100, true);  } 

    This logic mirrors the way a man should handle his own career and reputation. You don’t just “show up” and hope things work out; you audit the environment, you check for gaps in your own “schema,” and you provision the skills you’re missing before the deadline hits. If you aren’t checking your own internal “code” for errors daily, you’re eventually going to hit a runtime exception that you can’t recover from.

    Stability is built in the hidden layers. Most people only care about the UI, the “pretty” part of the SPFx web part that the stakeholders see. But if your hidden provisioning logic is sloppy, the UI is just a facade on a crumbling foundation. Integrity in the hidden functions leads to integrity in the final product.

    The View Layer: Controlling the Perspective

    A list is a database, but a View is the interface. If you provision the fields but leave the “All Items” view in its default state, you are forcing the user to manually configure the UI—which defeats the entire purpose of programmatic deployment. You have to dictate exactly how the data is presented. This is about leadership; you don’t leave the “perspective” of your data to chance.

    When we provision the ProjectContacts view, we aren’t just adding columns; we are defining the “Load-Bearing” information. We decide that the EmailAddr and IsActive status are more important than the CreatedDate. We programmatically remove the fluff and surface the metrics that matter.

     // Dictating the Perspective: View Configuration  const list = sp.web.lists.getByTitle("ProjectContacts");  const view = await list.defaultView();   const columns = ["Title", "EmailAddr", "City", "IsActive"];  for (const name of columns) {      await list.views.getById(view.Id).fields.add(name);  } 

    In your own life, you have to be the architect of your own “View.” If you let the world decide what “columns” of your life are visible, they’ll focus on the trivial. You have to programmatically decide what matters—your output, your stability, and your leadership. If you don’t define the view, someone else will, and they’ll usually get it wrong.

    Refactoring a messy View is the same as refactoring a messy life. It’s painful, it requires deleting things that people have grown used to, and it demands a cold, hard look at what is actually functional. But once the script runs and the View is clean, the clarity it provides is worth the effort of the build.

    The Closeout: No Excuses, Just Execution

    We have covered the precision of the XML “Old Guard” and the efficiency of the Fluent API. We have established that manual clicks are a form of technical failure and that idempotency is the only way to survive a production deployment.

    The “Secret” to being a SharePoint Architect isn’t some hidden knowledge or a certification; it’s the discipline to never take the easy way out. It’s the refusal to ship code that requires a “Manual Step” PDF. It’s the commitment to building infrastructure that is as solid as the hardware it runs on.

    If your SPFx solutions are still failing because of “missing columns” or “wrong list names,” stop blaming the platform and start looking at your deployment protocol. Refactor your scripts. Harden your schemas. Stop acting like a junior and start provisioning like an architect.

    You have the blueprints. You have the methods. Now, get into the codebase and eliminate the manual debt that is dragging down your career. The system is waiting for your command.

    *******

    These final modules are your implementation blueprints—the raw, compiled logic of the two provisioning protocols we’ve discussed. I’ve separated them so you can see exactly how the XML Precision and Fluent API approaches look when deployed in a production-ready TypeScript environment.

    One is your “Old Guard” assembly for absolute schema control, and the other is your modern, refactored protocol for speed and type-safety. Treat these as the “gold master” files for your SPFx initialization; copy them, study the differences in the dependency injection, and stop guessing how your infrastructure is built.

    ensureProjectContactsXML.ts

     // Filename: ensureProjectContactsXML.ts  import { SPFI } from "@pnp/sp";  import "@pnp/sp/webs";  import "@pnp/sp/lists";  import "@pnp/sp/fields";   /**   * PROVISIONING PROTOCOL: XML SCHEMA   * Use this when absolute precision of InternalNames and StaticNames is non-negotiable.   */  export const ensureProjectContactsXML = async (sp: SPFI): Promise<void> => {    const LIST_NAME = "ProjectContacts";    const LIST_DESC = "Centralized Stakeholder Directory - XML Provisioned";     try {      // 1. IDEMPOTENCY CHECK: Does the infrastructure exist?      try {        await sp.web.lists.getByTitle(LIST_NAME)();      } catch {        // 2. INITIALIZATION: Build the foundation        await sp.web.lists.add(LIST_NAME, LIST_DESC, 100, true);      }       const list = sp.web.lists.getByTitle(LIST_NAME);       // 3. SCHEMA INJECTION: Speaking the native tongue of SharePoint      const fieldsToCreate = [        `<Field Type="Text" Name="EmailAddr" StaticName="EmailAddr" DisplayName="E-Mail Address" Required="TRUE" />`,        `<Field Type="Note" Name="MailingAddress" StaticName="MailingAddress" DisplayName="Mailing Address" Required="FALSE" RichText="FALSE" />`,        `<Field Type="Text" Name="City" StaticName="City" DisplayName="City" Required="FALSE" />`      ];       for (const xml of fieldsToCreate) {        // We don't check for existence here for brevity, but a Lead would.        await list.fields.createFieldAsXml(xml);      }       console.log("XML Provisioning Protocol Complete.");    } catch (err) {      console.error("Critical Failure in XML Provisioning:", err);      throw err;    }  }; 

    ensureProjectContactsFluent.ts

     // Filename: ensureProjectContactsFluent.ts  import { SPFI } from "@pnp/sp";  import "@pnp/sp/webs";  import "@pnp/sp/lists";  import "@pnp/sp/fields";   /**   * PROVISIONING PROTOCOL: FLUENT API   * Use this for high-speed, readable, and type-safe infrastructure deployment.   */  export const ensureProjectContactsFluent = async (sp: SPFI): Promise<void> => {    const LIST_NAME = "ProjectContacts";        try {      // 1. INFRASTRUCTURE AUDIT      let listExists = false;      try {        await sp.web.lists.getByTitle(LIST_NAME)();        listExists = true;      } catch {        await sp.web.lists.add(LIST_NAME, "Stakeholder Directory - Fluent Provisioned", 100, true);      }       const list = sp.web.lists.getByTitle(LIST_NAME);       // 2. LOAD-BEARING FIELDS: Strongly typed and validated      // Provisioning the Boolean 'IsActive'      await list.fields.addBoolean("IsActive", {        Title: "Is Active",        Group: "Project Metadata",        DefaultValue: "1" // True      });       // Provisioning the URL 'LinkedInProfile'      await list.fields.addUrl("LinkedInProfile", {        Title: "LinkedIn Profile",        Required: false      });       console.log("Fluent API Provisioning Protocol Complete.");    } catch (err) {      console.error("Critical Failure in Fluent Provisioning:", err);      throw err;    }  }; 

    Call to Action


    If this post sparked your creativity, don’t just scroll past. Join the community of makers and tinkerers—people turning ideas into reality with 3D printing. Subscribe for more 3D printing guides and projects, drop a comment sharing what you’re printing, or reach out and tell me about your latest project. Let’s build together.

    D. Bryan King

    Sources

    Disclaimer:

    The views and opinions expressed in this post are solely those of the author. The information provided is based on personal research, experience, and understanding of the subject matter at the time of writing. Readers should consult relevant experts or authorities for specific guidance related to their unique situations.

    Related Posts

    Rate this:

    #AutomatedDeployment #AutomationProtocol #BackendLogic #cleanCode #codeQuality #CRUDOperations #DataContracts #DeploymentAutomation #devopsForSharePoint #EnterpriseDevelopment #errorHandling #FieldCreation #FluentAPI #Idempotency #InfrastructureAsCode #LeadDeveloper #ListTemplates #LoadBearingCode #MetadataArchitecture #Microsoft365 #MicrosoftGraph #ODataQueries #PnPPowerShell #PnPjs #professionalCoding #ProgrammaticProvisioning #RESTAPI #SchemaAutomation #Scripting #SharePointArchitect #SharePointFramework #SharePointLists #SharePointOnline #SiteScripts #softwareArchitecture #softwareEngineering #SPFxDevelopment #systemStability #technicalDebt #Telemetry #TypeScript #ViewConfiguration #WebDevelopment #webPartDevelopment #XMLSchema
  21. Как поход в кино превратился в сессию системного дизайна

    Недавно ходил в кино и, пока стоял в очереди на вход, поймал себя на мысли, что проектирую систему, которой пользуется контролер. На первый взгляд задача примитивная: есть база билетов, контролер сканирует QR, система должна проверить билет и пустить человека. Главное условие - один билет используется ровно один раз. Я прикинул, и понял, что проблем там гораздо больше, чем кажется ..

    habr.com/ru/articles/1017332/

    #distributed_systems #распределенные_системы #проектирование_систем #system_design #software_engineering #postgresql #разработка_программного_обеспечения #idempotency #backend #backendразработка

  22. Как поход в кино превратился в сессию системного дизайна

    Недавно ходил в кино и, пока стоял в очереди на вход, поймал себя на мысли, что проектирую систему, которой пользуется контролер. На первый взгляд задача примитивная: есть база билетов, контролер сканирует QR, система должна проверить билет и пустить человека. Главное условие - один билет используется ровно один раз. Я прикинул, и понял, что проблем там гораздо больше, чем кажется ..

    habr.com/ru/articles/1017332/

    #distributed_systems #распределенные_системы #проектирование_систем #system_design #software_engineering #postgresql #разработка_программного_обеспечения #idempotency #backend #backendразработка

  23. Как поход в кино превратился в сессию системного дизайна

    Недавно ходил в кино и, пока стоял в очереди на вход, поймал себя на мысли, что проектирую систему, которой пользуется контролер. На первый взгляд задача примитивная: есть база билетов, контролер сканирует QR, система должна проверить билет и пустить человека. Главное условие - один билет используется ровно один раз. Я прикинул, и понял, что проблем там гораздо больше, чем кажется ..

    habr.com/ru/articles/1017332/

    #distributed_systems #распределенные_системы #проектирование_систем #system_design #software_engineering #postgresql #разработка_программного_обеспечения #idempotency #backend #backendразработка

  24. Как поход в кино превратился в сессию системного дизайна

    Недавно ходил в кино и, пока стоял в очереди на вход, поймал себя на мысли, что проектирую систему, которой пользуется контролер. На первый взгляд задача примитивная: есть база билетов, контролер сканирует QR, система должна проверить билет и пустить человека. Главное условие - один билет используется ровно один раз. Я прикинул, и понял, что проблем там гораздо больше, чем кажется ..

    habr.com/ru/articles/1017332/

    #distributed_systems #распределенные_системы #проектирование_систем #system_design #software_engineering #postgresql #разработка_программного_обеспечения #idempotency #backend #backendразработка

  25. Очередь задач на Postgres: SKIP LOCKED + lease/heartbeat + backpressure (практический опыт)

    Как сделать надёжную очередь задач без Rabbit/Kafka, используя только Postgres? Разбираю боевой паттерн: FOR UPDATE SKIP LOCKED для конкурентного забора, lease/heartbeat для возврата задач после падений и backpressure, чтобы воркеры не съели память.

    habr.com/ru/articles/984102/

    #PostgreSQL #очередь_задач #SKIP_LOCKED #FOR_UPDATE #lease #heartbeat #backpressure #atleastonce #idempotency #graceful_shutdown

  26. Очередь задач на Postgres: SKIP LOCKED + lease/heartbeat + backpressure (практический опыт)

    Как сделать надёжную очередь задач без Rabbit/Kafka, используя только Postgres? Разбираю боевой паттерн: FOR UPDATE SKIP LOCKED для конкурентного забора, lease/heartbeat для возврата задач после падений и backpressure, чтобы воркеры не съели память.

    habr.com/ru/articles/984102/

    #PostgreSQL #очередь_задач #SKIP_LOCKED #FOR_UPDATE #lease #heartbeat #backpressure #atleastonce #idempotency #graceful_shutdown

  27. Очередь задач на Postgres: SKIP LOCKED + lease/heartbeat + backpressure (практический опыт)

    Как сделать надёжную очередь задач без Rabbit/Kafka, используя только Postgres? Разбираю боевой паттерн: FOR UPDATE SKIP LOCKED для конкурентного забора, lease/heartbeat для возврата задач после падений и backpressure, чтобы воркеры не съели память.

    habr.com/ru/articles/984102/

    #PostgreSQL #очередь_задач #SKIP_LOCKED #FOR_UPDATE #lease #heartbeat #backpressure #atleastonce #idempotency #graceful_shutdown

  28. Очередь задач на Postgres: SKIP LOCKED + lease/heartbeat + backpressure (практический опыт)

    Как сделать надёжную очередь задач без Rabbit/Kafka, используя только Postgres? Разбираю боевой паттерн: FOR UPDATE SKIP LOCKED для конкурентного забора, lease/heartbeat для возврата задач после падений и backpressure, чтобы воркеры не съели память.

    habr.com/ru/articles/984102/

    #PostgreSQL #очередь_задач #SKIP_LOCKED #FOR_UPDATE #lease #heartbeat #backpressure #atleastonce #idempotency #graceful_shutdown

  29. Реализация итоговой согласованности. Разбор библиотеки event-outbox

    В этой статье я хотел бы рассказать об архитектурных шаблонах Transactional Outbox и Idempotent Consumer. Кроме того, я хотел бы показать собственную реализацию, содержащую интересное сочетание технологий, выходящее за рамки этих шаблонов, значительно упрощающее реализацию и эксплуатацию.

    habr.com/ru/articles/820867/

    #transactional_outbox #python3 #kafka_apache #mongodb #idempotency #я_пиарюсь

  30. Реализация итоговой согласованности. Разбор библиотеки event-outbox

    В этой статье я хотел бы рассказать об архитектурных шаблонах Transactional Outbox и Idempotent Consumer. Кроме того, я хотел бы показать собственную реализацию, содержащую интересное сочетание технологий, выходящее за рамки этих шаблонов, значительно упрощающее реализацию и эксплуатацию.

    habr.com/ru/articles/820867/

    #transactional_outbox #python3 #kafka_apache #mongodb #idempotency #я_пиарюсь

  31. Реализация итоговой согласованности. Разбор библиотеки event-outbox

    В этой статье я хотел бы рассказать об архитектурных шаблонах Transactional Outbox и Idempotent Consumer. Кроме того, я хотел бы показать собственную реализацию, содержащую интересное сочетание технологий, выходящее за рамки этих шаблонов, значительно упрощающее реализацию и эксплуатацию.

    habr.com/ru/articles/820867/

    #transactional_outbox #python3 #kafka_apache #mongodb #idempotency #я_пиарюсь

  32. Idempotency Keys: How PayPal and Stripe Prevent Duplicate Payment

    medium.com/@sahintalha1/the-wa

    "[I]dempotency keys represent a fundamental innovation in digital payments, ensuring transactions are executed once and thereby enhancing security and user experience." -- #TalhaŞahin

    #api360 #payments #idempotency

  33. Idempotency Keys: How PayPal and Stripe Prevent Duplicate Payment

    medium.com/@sahintalha1/the-wa

    "[I]dempotency keys represent a fundamental innovation in digital payments, ensuring transactions are executed once and thereby enhancing security and user experience." -- #TalhaŞahin

    #api360 #payments #idempotency

  34. Idempotency Keys: How PayPal and Stripe Prevent Duplicate Payment

    medium.com/@sahintalha1/the-wa

    "[I]dempotency keys represent a fundamental innovation in digital payments, ensuring transactions are executed once and thereby enhancing security and user experience." -- #TalhaŞahin

    #api360 #payments #idempotency

  35. Idempotency Keys: How PayPal and Stripe Prevent Duplicate Payment

    medium.com/@sahintalha1/the-wa

    "[I]dempotency keys represent a fundamental innovation in digital payments, ensuring transactions are executed once and thereby enhancing security and user experience." -- #TalhaŞahin

    #api360 #payments #idempotency

  36. Idempotency Keys: How PayPal and Stripe Prevent Duplicate Payment

    medium.com/@sahintalha1/the-wa

    "[I]dempotency keys represent a fundamental innovation in digital payments, ensuring transactions are executed once and thereby enhancing security and user experience." -- #TalhaŞahin

    #api360 #payments #idempotency

  37. Last week, I wrote an analysis of the #ITEF #Idempotency-Key specification. The specification aims to avoid duplicated requests. In short, the idea is for the client to send a unique key along with the request:

    * If the server doesn’t know the key, it proceeds as usual and then stores the respons

    * If the server knows the key, it short-circuits any further processing and immediately returns the stored response

    This post shows how to implement it with #ApacheAPISIX.

    blog.frankel.ch/implement-idem

  38. The first rule of #distributedsystems is "Don’t distribute your system". Designing distributed systems right is infamously hard for multiple reasons.

    Imagine that the client sending a request sends a unique key along. The server keeps track of key-request pairs.

    It’s precisely the idea behind the #IETF #specification The #Idempotency-Key HTTP Header Field.

    blog.frankel.ch/fix-duplicate-

    #API #APIs

  39. Explore what #Idempotency means, why it matters, and how it shapes how we design and interact with software: bit.ly/3upbRQt

    Whether you’re a seasoned developer or just embarking on your coding journey, understanding idempotency is crucial to writing more robust and resilient programs.

    #InfoQ #CloudComputing #AWS #Serverless