{"id":183,"date":"2020-12-01T17:00:00","date_gmt":"2020-12-01T17:00:00","guid":{"rendered":"https:\/\/fde.cat\/index.php\/2020\/12\/01\/from-lambda-to-lambda-less-lessons-learned\/"},"modified":"2021-02-02T13:45:34","modified_gmt":"2021-02-02T13:45:34","slug":"from-lambda-to-lambda-less-lessons-learned","status":"publish","type":"post","link":"https:\/\/fde.cat\/index.php\/2020\/12\/01\/from-lambda-to-lambda-less-lessons-learned\/","title":{"rendered":"From Lambda to Lambda-less: Lessons learned"},"content":{"rendered":"<div class=\"resourceParagraph section\">\n<div class=\"component-anchor-container\">\n  <a class=\"component-anchor\" name=\"post_par_resourceparagraph\"><\/a>\n <\/div>\n<div class=\"resource-text-section\">\n<div class=\"resource-paragraph rich-text\">\n<p><i>Co-authors: <a href=\"https:\/\/www.linkedin.com\/in\/zhangxiang\/\" target=\"_blank\" rel=\"noopener\">Xiang Zhang<\/a> and <a href=\"https:\/\/www.linkedin.com\/in\/jingyu-zhu-06880279\/\" target=\"_blank\" rel=\"noopener\">Jingyu Zhu<\/a><\/i><\/p>\n<h2>Introduction<\/h2>\n<p>The <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lambda_architecture\" target=\"_blank\" rel=\"noopener\">Lambda architecture<\/a> has become a popular architectural style that promises both speed and accuracy in data processing by using a hybrid approach of both batch processing and stream processing methods. But it also has some drawbacks, such as complexity and additional development\/operational overheads. One of our features for Premium members on LinkedIn, <a href=\"https:\/\/www.linkedin.com\/me\/profile-views\/urn:li:wvmp:summary\/\" target=\"_blank\" rel=\"noopener\">Who Viewed Your Profile<\/a> (WVYP), relied on a Lambda architecture for some time. The backend system supporting this feature had gone through a few architectural iterations in the past years: it started as a Kafka client processing a single Kafka topic, and eventually evolved to a Lambda architecture with more complicated processing logic. However, in an effort to pursue faster product iteration and lower operational overheads, we recently underwent a transition to make it Lambda-less. In this blog post, we\u2019ll share some of the lessons learned in operating this system in the Lambda architecture, the decisions made in transitioning to Lambda-less, and the shifts necessary to undergo this transition.<\/p>\n<h2>How the system works<\/h2>\n<p>The WVYP system relies on a number of different input sources to provide members with an up-to-date record of who most recently viewed their profile. These details include:\u00a0<\/p>\n<ul>\n<li>Capture profile view information and its deduplication<\/li>\n<li>Compute view sources (e.g., search, profile page, etc.)<\/li>\n<li>View relevance (e.g., a senior leader viewed your profile)<\/li>\n<li>View obfuscations based on the viewing member\u2019s privacy settings<\/li>\n<\/ul>\n<p>The following diagram describes a simplified version of the system using the Lambda architecture.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/div>\n<div class=\"resourceImageBlock section\">\n<div class=\"component-anchor-container\">\n  <a class=\"component-anchor\" name=\"post_par_resourceimageblock\"><\/a>\n <\/div>\n<ul class=\"resource-image-block single\">\n<li class=\"resource-image\"> <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/content.linkedin.com\/content\/dam\/engineering\/site-assets\/images\/blog\/posts\/2020\/12\/lambda-less-1.png?resize=750%2C366&#038;ssl=1\" alt=\"diagram-showing-the-original-lambda-architecture-of-who-viewed-your-profile\" height=\"366\" width=\"750\"  data-recalc-dims=\"1\"> <\/li>\n<\/ul>\n<\/div>\n<div class=\"resourceParagraph section\">\n<div class=\"component-anchor-container\">\n  <a class=\"component-anchor\" name=\"post_par_resourceparagraph_2088949958\"><\/a>\n <\/div>\n<div class=\"resource-text-section\">\n<div class=\"resource-paragraph rich-text\">\n<p>First, we had a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Real-time_computing#Near_real-time\" target=\"_blank\" rel=\"noopener\">nearline<\/a> Kafka client that enabled near real-time processing and serving of profile view activities. When a member viewed another member\u2019s profile, an event called ProfileViewEvent was generated and sent to a Kafka topic. The nearline processing job would consume the ProfileViewEvent and call approximately ten other online services to fetch additional information, such as member profile data, job application information, member network distance (first-degree, second-degree connection), etc. Then, the job would write the processed message to another Kafka topic, which in turn would be consumed by <a href=\"https:\/\/pinot.apache.org\/\" target=\"_blank\" rel=\"noopener\">Pinot<\/a>, a distributed OLAP datastore. Pinot appended the processed message to a table called real-time table. Pinot was ideal in that it can <a href=\"https:\/\/engineering.linkedin.com\/blog\/2019\/auto-tuning-pinot\" target=\"_blank\" rel=\"noopener\">use both offline and real-time data<\/a>.<\/p>\n<p>In parallel to this, there was also a set of offline <a href=\"https:\/\/hadoop.apache.org\/\" target=\"_blank\" rel=\"noopener\">Hadoop<\/a> <a href=\"https:\/\/en.wikipedia.org\/wiki\/MapReduce\" target=\"_blank\" rel=\"noopener\">MapReduce<\/a> jobs performing all of the above operations in a different technology stack, using the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Extract,_transform,_load\" target=\"_blank\" rel=\"noopener\">ETL\u2019ed<\/a> ProfileViewEvent and the corresponding datasets of those online downstream services. The jobs loaded those datasets daily and performed data transformation operations, such as filtering, grouping, and joining. In addition, as depicted in the diagram above, the offline jobs would also process the NavigationEvent that would not be processed by the nearline job, which showed how the profile viewer found the profile owner. The processed dataset was then pushed to Pinot\u2019s offline table.<\/p>\n<p>The Pinot database handled data serving from the real-time and offline tables transparently. A midtier service queried Pinot for the processed profile view information, and sliced and diced the data based on query parameters (such as time range, view occupations, etc.) from the frontend API.<\/p>\n<p>This implemented the Lambda architecture:<\/p>\n<ul>\n<li>The nearline job was the speed layer, providing fast computation of incomplete information<\/li>\n<li>The Hadoop offline jobs were the batch layer, aimed at accuracy and throughput<\/li>\n<li>The Pinot datastore was the serving layer, combining the views from the batch layer and speed layer<\/li>\n<\/ul>\n<p>Relying on Lambda architecture brought a number of wins, thanks to the <b>speed processing<\/b> by the speed layer, and <b>accuracy<\/b> and <b>re-processability<\/b> by the batch layer. However, it also came with a lot of overheads. As we continued to iterate the product and add more complexity, it was time for a change.<\/p>\n<h2>The challenge<\/h2>\n<p>It is well known that Lambda architectures come with overhead expenses that draw <a href=\"https:\/\/www.oreilly.com\/radar\/questioning-the-lambda-architecture\/\" target=\"_blank\" rel=\"noopener\">criticism<\/a>. The overheads violate the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\" target=\"_blank\" rel=\"noopener\">\u201cDon\u2019t repeat yourself\u201d (DRY) principle<\/a>. More specifically, the WVYP\u00a0 system faced the following challenges:<\/p>\n<ol>\n<li>Developers had to build, deploy, and maintain two pipelines that essentially produce the same data for the most part<\/li>\n<li>The two processing flows needed to be in sync in terms of business logic<\/li>\n<\/ol>\n<p>Both of the above challenges incurred significant costs in terms of developer time.\u00a0<\/p>\n<p>Systems evolve for a number of different reasons, including feature enhancements, bug fixes, changes for compliances or security, data migrations, etc. All of these changes for WYVP came with doubled efforts in part because of the Lambda architecture. What\u2019s worse, the Lambda architecture also created additional liability in that new bugs could occur in either the batch or speed layer since we were essentially implementing most features in two different technology stacks. Additionally, as LinkedIn evolved its tools and stack, we were constantly tasked with keeping up with the work required in keeping more flows up to date. For example, we found unnecessary complications in a recent GEO location data migration due to the interplay of various moving parts and ramp schedules. The division of layers in the Lambda architecture created operational challenges all around. For instance, the nearline job would have lags in message processing, and the offline jobs would fail from time to time\u2014both instances that we became much too familiar with. Ultimately, the upkeep was not worth the value in that it significantly slowed down development velocity. With these considerations in mind, we embarked upon an effort to move WVYP away from the Lambda architecture.<\/p>\n<h2>The Lambda-less architecture<\/h2>\n<p>We set off to simplify the architecture by removing the entire set of offline batch jobs in the old architecture and developing a new nearline message processor using <a href=\"http:\/\/samza.apache.org\/\" target=\"_blank\" rel=\"noopener\">Samza<\/a>. Recognizing that streaming and offline batch processing each has its own merits applicable to different requirements, we focus in this blog on how we proceeded with the former for our needs at the time. The primary reason we chose to keep nearline processing and remove offline processing is the product requirements of near real-time profile view notifications. There are many other cases in which batch processing is more suitable or essential, such as computing business metrics impacts in A\/B testing.<\/p>\n<p>The new architecture is shown in the diagram below.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/div>\n<div class=\"resourceImageBlock section\">\n<div class=\"component-anchor-container\">\n  <a class=\"component-anchor\" name=\"post_par_resourceimageblock_438458018\"><\/a>\n <\/div>\n<ul class=\"resource-image-block single\">\n<li class=\"resource-image\"> <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/content.linkedin.com\/content\/dam\/engineering\/site-assets\/images\/blog\/posts\/2020\/12\/lambda-less-2.png?resize=750%2C292&#038;ssl=1\" alt=\"diagram-showing-the-new-lambdaless-architecture-of-who-viewed-your-profile\" height=\"292\" width=\"750\"  data-recalc-dims=\"1\"> <\/li>\n<\/ul>\n<\/div>\n<div class=\"resourceParagraph section\">\n<div class=\"component-anchor-container\">\n  <a class=\"component-anchor\" name=\"post_par_resourceparagraph_1361706532\"><\/a>\n <\/div>\n<div class=\"resource-text-section\">\n<div class=\"resource-paragraph rich-text\">\n<p>There are two major changes in this architecture:<\/p>\n<ul>\n<li>A new Samza job is created to consume both ProfileViewEvent and NavigationEvent, instead of the old consumer which only consumed the former.<\/li>\n<li>All existing offline jobs are removed and, in its place, we created a singular job that will be discussed later.<\/li>\n<\/ul>\n<p>The Samza job<\/p>\n<p>Samza, now an Apache project, was originally developed by LinkedIn and is LinkedIn\u2019s de facto distributed stream processing service. We chose to migrate from the existing nearline processor job to a Samza job for a number of reasons.<\/p>\n<p>First of all, Samza supports a variety of programming models, including the Beam programming model. Samza implements the <a href=\"https:\/\/beam.apache.org\/\" target=\"_blank\" rel=\"noopener\">Beam API<\/a>: this allows us to easily create a pipeline of data processing units including filtering, transformations, joins, and more. For example, in our case, we can easily join the PageViewEvent and NavigationEvent to compute the source of views in near-real-time\u2014this could not as easily have been done in the old processor. Secondly, deploying and maintaining Samza jobs at LinkedIn is straightforward once it\u2019s set up because they&#8217;re run on a <a href=\"https:\/\/hadoop.apache.org\/docs\/current\/hadoop-yarn\/hadoop-yarn-site\/YARN.html\" target=\"_blank\" rel=\"noopener\">YARN cluster<\/a> maintained by the Samza team. The dev team does still need to manage the scaling, performance, etc., but it does help immensely on the regular maintenance side (e.g., not need to worry about machine failures). Finally, Samza is well-supported and well-integrated with other LinkedIn tooling and environments.<\/p>\n<p><b>The new offline job<br \/> <\/b>Some may wonder why we still incorporated an offline job in the Lambda-less architecture. The truth is it isn\u2019t necessary from the architecture transition perspective. However, as depicted in the diagram above, the offline job reads from the ETLed data in HDFS indirectly produced by the Samza job via a Kafka topic. The only purpose of the offline job is to copy all the data that was written to the real-time table in Pinot to the offline table. This is done for two reasons: 1) the offline table has much better performance due to how <a href=\"https:\/\/engineering.linkedin.com\/blog\/2019\/auto-tuning-pinot\" target=\"_blank\" rel=\"noopener\">data is organized<\/a> (in short offline tables with much fewer data segments than the real-time table enabling faster query); and 2) we store the processed view data for up to 90 days with an automatic data purge, whereas the real-time table only retains the data for a few days. A key difference between the new offline job and its previous iterations in the old architecture is that the job has no overlap with the nearline job in processing logic. None of the logic implemented in the Samza job is implemented here. We can remove this job when Pinot is able to automatically support the consolidation of files from the real-time table to the offline table.<\/p>\n<p><b>Message re-processability<br \/> <\/b>There is no bug-free software in its entire lifecycle; we recognize that things can still go wrong in different ways. In the case of WVYP, an event processed using the wrong logic will remain in the database until it\u2019s reprocessed and fixed. Moreover, unexpected issues can happen outside of the system\u2019s control (e.g., in a way that can impact your data sources). A big promise of batch processing is re-processability. If a job fails, it can reliably re-run and produce the same data. If source data is corrupted, it can re-run to reprocess it.<\/p>\n<p>This becomes a lot more challenging in the streaming case, particularly when the processing relies on other stateful online services to provide additional data. Message processing becomes <b>non-idempotent<\/b>. WVYP not only relies on online services for states, but also sends notifications to members when messages are processed (important in that we do not want to be sending out duplicate notifications). If the chosen datastore does not support random updates by design, such as Pinot, we needed a dedupe mechanism in place.<\/p>\n<p>We recognize that there is no silver bullet to this problem. Instead, we decided to treat each problem differently and use different strategies to mitigate issues:<\/p>\n<ul>\n<li>If we need to make minor changes to the processed messages, the best approach will be to write a one-off offline job script to read the processed messages in HDFS (just as we do for the offline job in the new architecture), correct whatever is needed, and push to Pinot to override the previous data files.\u00a0<\/li>\n<li>If there is a major processing error or if the Samza job failed to process a large number of events, we can rewind the current processing offset to a previous point in Kafka.\u00a0<\/li>\n<li>If the job only degrades its behavior for certain periods of time, such as if the computation of view relevance fails, we would skip the relevance of some views. In this scenario, the system would function in reduced capacity for that period of time.<\/li>\n<\/ul>\n<p><b>Deduplication<br \/> <\/b>Duplicate processing happens in various scenarios. One, mentioned above, is an instance in which we explicitly want to re-process the data. Another is inherent to Samza, which guarantees at-least-once processing. When Samza containers are restarted, it will likely process some messages again because the checkpoint it reads will likely not reflect the last message it processed. We are able to address this deduplication at two places:\u00a0<\/p>\n<ul>\n<li>The serving layer: When the midtier service reads from the Pinot table, it performs deduplication and picks the view with the latest processed time.<\/li>\n<li>The notification layer: The <a href=\"https:\/\/engineering.linkedin.com\/blog\/2018\/03\/air-traffic-controller--member-first-notifications-at-linkedin\" target=\"_blank\" rel=\"noopener\">notification infrastructure<\/a> ensures that we do not send duplicate notifications to a member in a configurable period of time.<\/li>\n<\/ul>\n<h2>The value<\/h2>\n<p>Lambda architecture has been around for many years and has gained its fair share of praise and critiques. In our case of migrating WVYP, we were able to see the following benefits:<\/p>\n<ul>\n<li>Significant improvements in development velocity by halving most measures of development time. Reduced maintenance overheads by more than half (the nearline flow had fewer maintenance overheads than the batch processing flow).<\/li>\n<li>Improved member experience. There is now a reduced likelihood of introducing bugs in the development process. We also have better nearline computation (e.g., fast computation of view sources which was not available earlier) allowing us to serve WVYP information to members faster.<\/li>\n<\/ul>\n<p>By freeing up developer time, we\u2019re now able to iterate much faster on the system and focus efforts elsewhere. By sharing a look into how the WVYP system was initially developed, operated, and rehauled, we hope that some of our takeaways will help individuals facing similar challenges or considerations in using the Lambda architecture make better decisions.<\/p>\n<h2>Acknowledgments<\/h2>\n<p>We\u2019d like to thank <a href=\"https:\/\/www.linkedin.com\/in\/carlosroman\/\" target=\"_blank\" rel=\"noopener\">Carlos Roman<\/a>, <a href=\"https:\/\/www.linkedin.com\/in\/kwu\/\" target=\"_blank\" rel=\"noopener\">Ke Wu<\/a>, <a href=\"https:\/\/www.linkedin.com\/in\/joshabadie\/\" target=\"_blank\" rel=\"noopener\">Josh Abadie<\/a>, <a href=\"https:\/\/www.linkedin.com\/in\/christopher-harris-a3984766\/\" target=\"_blank\" rel=\"noopener\">Chris Harris<\/a>, <a href=\"https:\/\/www.linkedin.com\/in\/davidbliu\/\" target=\"_blank\" rel=\"noopener\">David Liu<\/a>, <a href=\"https:\/\/www.linkedin.com\/in\/hai-lu-a9a80857\/\" target=\"_blank\" rel=\"noopener\">Hai Lu<\/a>, <a href=\"https:\/\/www.linkedin.com\/in\/subbusubramaniam\/\" target=\"_blank\" rel=\"noopener\">Subbu Subramaniam<\/a>, and <a href=\"https:\/\/www.linkedin.com\/in\/zhongen-tao\/\" target=\"_blank\" rel=\"noopener\">Zhonggen Tao<\/a> for their feedback on the design; <a href=\"https:\/\/www.linkedin.com\/in\/hai-lu-a9a80857\/\" target=\"_blank\" rel=\"noopener\">Hai Lu<\/a>, <a href=\"https:\/\/www.linkedin.com\/in\/jdesjean\/\" target=\"_blank\" rel=\"noopener\">Jean-Francois Desjeans Gauthier<\/a>, and <a href=\"https:\/\/www.linkedin.com\/in\/chrisrng\/\" target=\"_blank\" rel=\"noopener\">Chris Ng<\/a> for their review of this blog post; <a href=\"https:\/\/www.linkedin.com\/in\/priyamawasthi\/\" target=\"_blank\" rel=\"noopener\">Priyam Awasthi<\/a> for her contributions to the implementation; <a href=\"https:\/\/www.linkedin.com\/in\/hristodanchev\/\" target=\"_blank\" rel=\"noopener\">Hristo Danchev<\/a>, <a href=\"https:\/\/www.linkedin.com\/in\/rayman-preet-singh-225a5b121\/\" target=\"_blank\" rel=\"noopener\">Ray Manpreet Singh Matharu<\/a>, and <a href=\"https:\/\/www.linkedin.com\/in\/lakshmi-manasa-gaduputi-18b9994\/\" target=\"_blank\" rel=\"noopener\">Manasa Gaduputi<\/a> from the Samza team for support and helping troubleshooting issues; and\u00a0<a href=\"https:\/\/www.linkedin.com\/in\/srirampanyam\/\" target=\"_blank\" rel=\"noopener\">Sriram Panyam<\/a>\u00a0and\u00a0<a href=\"https:\/\/www.linkedin.com\/in\/bayenew\/\" target=\"_blank\" rel=\"noopener\">Bef Ayenew<\/a> for their support on this project.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/div>\n<p><a href=\"https:\/\/engineering.linkedin.com\/blog\/2020\/lambda-to-lambda-less-architecture\" target=\"_blank\" rel=\"noopener\">Read More<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Co-authors: Xiang Zhang and Jingyu Zhu Introduction The Lambda architecture has become a popular architectural style that promises both speed and accuracy in data processing by using a hybrid approach of both batch processing and stream processing methods. But it also has some drawbacks, such as complexity and additional development\/operational overheads. One of our features&hellip; <a class=\"more-link\" href=\"https:\/\/fde.cat\/index.php\/2020\/12\/01\/from-lambda-to-lambda-less-lessons-learned\/\">Continue reading <span class=\"screen-reader-text\">From Lambda to Lambda-less: Lessons learned<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":"","footnotes":""},"categories":[1,7],"tags":[],"class_list":["post-183","post","type-post","status-publish","format-standard","hentry","category-external","category-technology","entry"],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":268,"url":"https:\/\/fde.cat\/index.php\/2021\/08\/31\/zero-downtime-node-patching-in-a-kubernetes-cluster\/","url_meta":{"origin":183,"position":0},"title":"Zero Downtime Node Patching in a Kubernetes Cluster","date":"August 31, 2021","format":false,"excerpt":"Authors: Vaishnavi Galgali, Arpeet Kale, Robert\u00a0XueIntroductionThe Salesforce Einstein Vision and Language services are deployed in an AWS Elastic Kubernetes Service (EKS) cluster. One of the primary security and compliance requirements is operating system patching. The cluster nodes that the services are deployed on need to have regular operating system updates.\u2026","rel":"","context":"In &quot;Technology&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":505,"url":"https:\/\/fde.cat\/index.php\/2021\/11\/17\/scaling-an-alerting-service-using-aws-lambda-functions\/","url_meta":{"origin":183,"position":1},"title":"Scaling an Alerting Service Using AWS Lambda Functions","date":"November 17, 2021","format":false,"excerpt":"Anyone who takes monitoring their services seriously knows that alerting is an important character in the monitoring saga. There is no point in collecting a huge amount of metrics if our teams won\u2019t be notified when they breach. When a television show has a successful first season, sometimes you\u2019ll notice\u2026","rel":"","context":"In &quot;Technology&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":225,"url":"https:\/\/fde.cat\/index.php\/2021\/02\/02\/flow-scheduling-for-the-einstein-ml-platform\/","url_meta":{"origin":183,"position":2},"title":"Flow Scheduling for the Einstein ML Platform","date":"February 2, 2021","format":false,"excerpt":"At Salesforce, we have thousands of customers using a variety of products. Some of our products are enhanced with machine learning (ML) capabilities. With just a few clicks, customers can get insights about their data. Behind the scenes, it\u2019s the Einstein Platform that builds hundreds of thousands of models, unique\u2026","rel":"","context":"In &quot;Technology&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":766,"url":"https:\/\/fde.cat\/index.php\/2023\/10\/02\/sre-weekly-issue-392\/","url_meta":{"origin":183,"position":3},"title":"SRE Weekly Issue #392","date":"October 2, 2023","format":false,"excerpt":"View on sreweekly.com A message from our sponsor, Rootly: Rootly is proud to have been recognized by G2 as a High Performer and Enterprise Leader in Incident Management for the sixth consecutive quarter! In total, we received nine G2 awards in the Summer Report. As a thank-you to our community,\u2026","rel":"","context":"In &quot;SRE&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":817,"url":"https:\/\/fde.cat\/index.php\/2024\/01\/29\/sre-weekly-issue-409\/","url_meta":{"origin":183,"position":4},"title":"SRE Weekly Issue #409","date":"January 29, 2024","format":false,"excerpt":"View on sreweekly.com A message from our sponsor, FireHydrant: It\u2019s time for a new world of alerting tools that prioritize engineer well-being and efficiency. The future lies in intelligent systems that are compatible with real life and use conditional rules to adapt and refine thresholds, reducing alert fatigue. https:\/\/firehydrant.com\/blog\/the-alert-fatigue-dilemma-a-call-for-change-in-how-we-manage-on-call\/ Executing\u2026","rel":"","context":"In &quot;SRE&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":794,"url":"https:\/\/fde.cat\/index.php\/2023\/11\/20\/sre-weekly-issue-399\/","url_meta":{"origin":183,"position":5},"title":"SRE Weekly Issue #399","date":"November 20, 2023","format":false,"excerpt":"View on sreweekly.com A message from our sponsor, FireHydrant: Severity levels help responders and stakeholders understand the incident impact and set expectations for the level of response. This can mean jumping into action faster. But first, you have to ensure severity is actually being set. Here\u2019s one way. https:\/\/firehydrant.com\/blog\/incident-severity-why-you-need-it-and-how-to-ensure-its-set\/ Paper:\u2026","rel":"","context":"In &quot;SRE&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/fde.cat\/index.php\/wp-json\/wp\/v2\/posts\/183","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fde.cat\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fde.cat\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fde.cat\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fde.cat\/index.php\/wp-json\/wp\/v2\/comments?post=183"}],"version-history":[{"count":1,"href":"https:\/\/fde.cat\/index.php\/wp-json\/wp\/v2\/posts\/183\/revisions"}],"predecessor-version":[{"id":219,"href":"https:\/\/fde.cat\/index.php\/wp-json\/wp\/v2\/posts\/183\/revisions\/219"}],"wp:attachment":[{"href":"https:\/\/fde.cat\/index.php\/wp-json\/wp\/v2\/media?parent=183"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fde.cat\/index.php\/wp-json\/wp\/v2\/categories?post=183"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fde.cat\/index.php\/wp-json\/wp\/v2\/tags?post=183"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}