paint-brush
完美值班工程师经过@alexeysutyagin
569 讀數
569 讀數

完美值班工程师

经过 Alexey Sutyagin10m2022/11/10
Read on Terminal Reader
Read this story w/o Javascript

太長; 讀書

许多IT公司都采用了值班的做法。工程师在这个角色中的职责因公司而异,但有一些共同点。要成为一名优秀的值班工程师,如果出现问题,您需要尽可能快速且经济高效地解决问题。训练有素的工程师知道他可以在哪里处理自己,以及在哪里值得进一步升级情况。我们将在本文中讨论如何为担任工程师的职责做好充分准备。

Company Mentioned

Mention Thumbnail
featured image - 完美值班工程师
Alexey Sutyagin HackerNoon profile picture


介绍

许多IT公司都采用了值班的做法。一名工程师在值班,他的职责持续一个班次。通常,轮班持续一天或一周。有增加或减少此期间的情况,但这种情况很少见。工程师在这个角色中的职责因公司而异,但有一些共同点。

  • 你必须回答进入团队的问题。
  • 有必要监控团队负责的服务的性能。
  • 处理火灾和事故。
  • 如果您无法弄清楚,请进一步升级事件。

我们将在本文中讨论如何为担任工程师的职责做好充分准备。

完美值班工程师的定义

如果您在战斗环境中轮班时发生事故或火灾,这并不意味着您是一个糟糕的工程师。要成为一名优秀的值班工程师,如果出现问题,您需要尽可能快速且经济高效地解决问题。训练有素的工程师知道他可以在哪里处理自己,以及在哪里值得进一步升级情况。他应该知道何时以及向谁寻求帮助。如果可能的话,他决不能让同样的问题重演。

经验

利用自己和团队的经验来更好地为职责做好准备是有帮助的。

最好先查看已经存在的用于处理事件的文档。是否有公司或团队级别的文档?必须知道它在哪里并熟悉它。如果它不存在,您可以尝试启动创建过程吗?

然后值得检查哪些事件已经发生以及它们是如何记录在知识库中的。是否有任何事后分析,是否有需要修复的任务?你知道这些任务是否正在完成吗?如果创建了解决问题的任务,但没有执行,这是在与您的经理会面时讨论这个问题的原因。

你知道值班工程师的职责有记录吗?他们负责什么,什么不负责?如果没有这样的文档或理解,那么整个团队都拥有一份文档会很有帮助。

工具

值班工程师的工具包是特定的,与开发人员的日常工具包有些不同。消防期间出现的主要任务是现有查询无法解决的任务

让我们更详细地看看这些工具:

  1. 值班人员的主要技术工具是 bash,借助它可以解决许多问题。如果您的武器库中还没有这个漂亮工具的知识 - 请使用其中一个速成课程(
  2. 通常在火灾模式下,您需要对产品数据库执行一些操作。通过终端使用数据库的技能 - PostgreSQL 的 psql https://www.postgresguide.com/utilities/psql/或 MongoDB 的 mongosh https://www.mongodb.com/docs/mongodb-shell/将有所帮助.这些工具是作为示例给出的,您可以搜索自己的数据库。对于许多数据库,有可视化工具可以使用,但终端随处可用,需要最少的互联网,并且非常灵活。对于开火模式,它可能非常有用。
  3. curl 是一个可以让你进行大量查询的工具,结合 bash 的知识,你将变得几乎无所不能。

如果你在火灾发生时手头有一套现成的脚本,这将非常有用。它们应该尽可能简单明了。是的,您可能可以很快地编写它们,但是当您的时间有限时,最好有一个现成的集合,让您只考虑崩溃而不考虑如何实现相同的绑定。下面的脚本只是这些脚本的潜在结构的表示。当然,您的代码应该在事件发生之前进行测试,并且尽可能简单明了。拥有以下脚本会很有帮助:

从提供的数据生成文件的脚本。这些可以从其他命令或通过提出独立请求获得。下面显示了 Python 中此类脚本的示例。

 import csv def modify(filename): tmpFile = "tmp.csv" # Reading file with data and creation of output file with open(filename, "r") as file, open(tmpFile, "w") as outFile: # Create reader for initial file reader = csv.reader(file, delimiter=',') # Create writer for output file writer = csv.writer(outFile, delimiter=',') # Read header line header = next(reader) # Write header line writer.writerow(header) # Process initial file line by line for row in reader: colValues = [] # Process each column of each line for col in row: # Let for example transform all columns to lowercase colValues.append(col.lower()) # Write modified line to final file writer.writerow(colValues) filename = 'sample_data.csv' modify(filename)

将调用具有指定并行度的所需端点的脚本。它不必很复杂。下面是一个简单的 JavaScript 代码示例,它将生成一个具有指定并行度的 sh 文件,可以帮助您。是的,我们这里没有结果处理,但并不总是需要,如果需要,您可以使用结果处理版本修改您的工具包。例如,我们有一个读取和写入整个数据的文件,但您可以为大文件创建流脚本。

 const fs = require('fs'); const initialFilePath = 'sample_data.csv'; const outputFilePath = 'sample_script.sh'; const amountOfParallelRequests = 5; // Remember about the throughput and the bandwidth of your services const delimiterForCSV = ','; // Read the initial file and split it by lines // You could transform it to an object if it's relevant to your situation let initialFile = fs.readFileSync(initialFilePath).toString().split('\n'); // Prepare boilerplate for sh script let outputString = '#!/bin/bash\n\n'; // Write data with parallel execution // Skip header for CSV // The code for parallel requests was received from https://serverfault.com/questions/456490/execute-curl-requests-in-parallel-in-bash // and you could implement your version instead for (let i = 1; i < initialFile.length; i++){ let line = initialFile[i]; if (!line) { continue; } let processedLine = line.split(delimiterForCSV); // We don't implement processing of errors here // Let's suggest that the necessary for request value lies in second column let desiredValue = processedLine[1]; if (desiredValue === undefined) { console.error('We have a trouble ' + line); } outputString += `curl -s -o foo http://example.com/file${desiredValue} && echo "done with ${desiredValue}" &\n`; if (i % amountOfParallelRequests === 0 || i === initialFile.length - 1) { outputString += '\nwait\n\n'; } } fs.writeFileSync(outputFilePath, outputString); // Indicate the success console.log('Success');

从数据库或服务中获取某些内容并将转换后的结果放回或可能调用另一个端点的脚本。我建议自己实现它,不要忘记授权和适当的使用场景。

知识

除了工具和经验之外,一定的知识在你上岗时也是有帮助的。

我想了解您的服务的日志和指标。他们去哪里,你如何到达那里?你会碰巧知道如何使用这些工具吗?当您在晚上接到来自待命服务的电话,告诉您您的服务已停止时 - 快速发现问题所在符合您的最大利益。为此,您需要准确了解指标和日志的存储位置以及首先要查看的内容。

如何推迟警报?分析事件后,经常会发现当前的事故可能正在等待早上,因此最好了解如何推迟警报。不要关闭,因为在某些操作的情况下会再次通知您,而恰恰是推迟。您应该记住在开始您的典型工作日后立即处理和纠正这种情况或发出警报。

联系人在哪里,或者您如何与同事或其他团队的成员取得联系?你的头脑中必须有一个明确的工具或知识——当事情发生时谁理解/应该知道情况。专家可以帮助您解决事件,利益相关者需要知道出了问题。您必须有权访问他们的联系人,最好是他们的电话,因为许多人会在工作时间以外关闭来自办公室聊天的通知。

如果存在访问级别,您如何访问生产/数据库并增加访问权限?如果您没有访问权限,您需要知道该去找谁或做什么才能获得您想要的访问权限。

如何快速将代码投入生产?有时问题需要在生产中快速更改服务代码。一般来说,这被认为是不好的做法,但通常在紧急情况下,情况并非如此。有时您不想等待长时间的 E2E 测试,但需要快速将代码放入生产环境。我希望您了解如何执行此操作。

数据库中存储了哪些数据?产品内部和服务之间是否有任何数据移动方案?如果您需要与数据库交互,最好了解数据在特定服务中的组织方式、数据来源以及使用者。这将使您能够更快地处理问题(如果有的话)。

除了工具和经验之外,一定的知识在你上岗时也是有帮助的。

我想了解您的服务的日志和指标。他们去哪里,你怎么去那里?你知道如何使用这些工具吗?当您在晚上接到来自待命服务的电话,告诉您您的服务已停止时 - 快速发现问题所在符合您的最大利益。为此,您需要准确了解指标和日志的存储位置以及首先要查看的内容。

如何推迟警报?分析事件后,经常会发现最近的事故可能正在等待早上,所以了解如何推迟警报是很好的。不要关闭,因为在某些操作的情况下,您会再次收到通知,而恰恰是推迟。如果您记得在开始典型工作日时立即处理和纠正情况或提醒,那将是最好的。

联系人在哪里,或者您如何与同事或其他团队的成员取得联系?你的头脑中必须有一个精确的工具或知识——当它发生时谁理解/应该知道情况。专家可以帮助您解决事件,利益相关者需要知道出了问题。您必须有权访问他们的联系人,最好是他们的电话,因为许多人会在工作时间以外关闭来自办公室聊天的通知。

如果存在访问级别,您如何访问生产/数据库并增加访问权限?如果您需要访问权限,您需要知道该找谁或做什么才能获得您想要的访问权限。

如何快速将代码投入生产?有时问题需要在生产中快速更改服务代码。一般来说,这被认为是不好的做法,但通常在紧急情况下,情况并非如此。有时您希望在长时间的 E2E 测试之前将代码快速投入生产环境。我希望您了解如何执行此操作。

数据库中存储了哪些数据?产品内部和服务之间是否有任何数据移动方案?如果您需要与数据库交互,最好了解数据在特定服务中的组织方式、数据来源以及使用者。这将使您能够更快地处理问题(如果有的话)。

结论

即使在具有优秀工程文化的公司和团队中,也会发生工作事故和火灾。为避免这种情况,团队必须尽一切努力改进当前的流程和产品。尽管如此,每个工程师还必须做好准备,以防发生事故并紧急处理。为此,值得使用所有积累的个人和团队经验。了解组织和服务并对您的工具包充满信心是值得了解的。

有用的链接

https://zach-gollwitzer.medium.com/the-ultimate-bash-crash-course-cb598141ad03

https://www.youtube.com/watch?v=oxuRxtrO2Ag

https://www.postgresguide.com/utilities/psql/

https://www.mongodb.com/docs/mongodb-shell/