为什么在 Azure 中进行缩放时不会调用 Stopping/OnStop?

2023-12-14

RoleEnvironment.Stopping/RoleEntryPoint.OnStop() 是not当我减少角色实例数时,要求死亡实例。他们are当实例重新启动或部署停止时调用。我做错了什么,或者在这种情况下我不需要清理?

我有一个简单的辅助角色(VS2012更新1,默认云项目有一个辅助角色,添加smarx 的表存储跟踪监听器)。所有代码都在这里;没有其他依赖项:

using System;
using System.Collections.Generic;
using System.Data.Services.Client;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Threading;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;

namespace WorkerRole1
{
    public class WorkerRole : RoleEntryPoint
    {
        bool shouldRun = true;
        EventWaitHandle runFinished = new EventWaitHandle(true, EventResetMode.ManualReset);

        public override bool OnStart()
        {
            ServicePointManager.DefaultConnectionLimit = 12;
            RoleEnvironment.Stopping += (object sender, RoleEnvironmentStoppingEventArgs e) => {
                Trace.WriteLine("WorkerRole1 Stopping called", "Information");
                shouldRun = false;
            };
            return base.OnStart();
        }

        public override void Run()
        {
            runFinished.Reset();
            try {
                Trace.WriteLine("WorkerRole1 entry point called", "Information");
                while (shouldRun) {
                    Thread.Sleep(10000);
                    Trace.WriteLine("Working", "Information");
                }
                Trace.WriteLine("Finished", "Information");
            } finally {
                runFinished.Set();
            }
        }

        public override void OnStop()
        {
            Trace.WriteLine("OnStop: Waiting for Run() to finish", "Information");
            runFinished.WaitOne();
            Trace.WriteLine("OnStop: Run() finished", "Information");
            base.OnStop();
        }
    }

    public class LogMessage : TableServiceEntity
    {
        public DateTime Time { get; set; }
        public string Message { get; set; }
        public string InstanceId { get; set; }
        public string Category { get; set; }

        public LogMessage() { }
        public LogMessage(string message, string category)
        {
            Message = message;
            Category = category;
            Time = DateTime.UtcNow;
            InstanceId = RoleEnvironment.CurrentRoleInstance.Id;
            PartitionKey = RoleEnvironment.DeploymentId;
            RowKey = (DateTime.MaxValue.Ticks - Time.Ticks).ToString("d19");
        }
    }

    public class TableTraceListener : TraceListener
    {
        private TableServiceContext _context = null;
        private TableServiceContext context
        {
            get
            {
                if (_context == null) {
                    var tables = CloudStorageAccount
                        .Parse(RoleEnvironment.GetConfigurationSettingValue(
                            Attributes["connectionStringName"] ?? "DataConnectionString"))
                        .CreateCloudTableClient();
                    tables.CreateTableIfNotExist("log");
                    _context = tables.GetDataServiceContext();
                    _context.MergeOption = MergeOption.NoTracking;
                }
                return _context;
            }
        }

        protected override string[] GetSupportedAttributes() { return new[] { "connectionStringName" }; }

        public override void Write(string message, string category)
        {
            context.AddObject("log", new LogMessage(message, category));
            context.SaveChangesWithRetries();
        }

        public override void WriteLine(string message, string category) { Write(message + "\n", category); }
        public override void Write(string message) { Write(message, null); }
        public override void WriteLine(string message) { Write(message + "\n"); }
    }
}

根据我的实验,结构控制器似乎在角色缩减操作期间(在角色完全删除之前)从数据库服务器的动态白名单中删除了角色 IP。

如果这也是问题的原因,则可能的解决方法是手动将 IP 范围 0.0.0.0-255.255.255.255 添加到数据库服务器的白名单中(以牺牲一些安全性为代价)。或者,您可以重新构建应用程序,以在 OnStop 期间将数据/消息写入队列而不是数据库(以便稍后将辅助角色复制到数据库)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 Azure 中进行缩放时不会调用 Stopping/OnStop? 的相关文章

随机推荐

  • 后台任务中的 Toast 通知响应

    我正在编写一个可以在后台任务中显示 toast 通知的应用程序 我使用BackgroundTaskBuilder 在通知中 我使用两个按钮 它们应该执行两个不同的功能 但我无法获得通知的响应 我在互联网上读到我应该为此启动另一个后台任务 但
  • 如何在服务中使用 kernel.terminate 事件

    我做了一个运行繁重任务的服务 该服务在控制器中调用 为了避免页面加载时间过长 我想返回 HTTP 响应并在之后运行繁重的任务 我读过我们可以使用 kernel terminate 事件来做到这一点 但我不明白如何使用它 目前我尝试在 Ker
  • @Autowired 不适用于球衣和弹簧

    当我当时运行测试时 Autowired 正在工作 但是当我运行 Web 应用程序并尝试当时获取数据时 它会抛出空指针异常 这是我的控制器 在此 BuyerRepo 中始终为 null import com retail exception
  • 在 Ruby on Rails 3 中使用 Twitter Bootstrap 图标作为链接的最佳方式?

    在 Rails 3 中使用 Twitter Bootstrap 提供的图标作为链接的最佳方式是什么 目前 我像粘贴的代码片段一样使用它 但当我使用平板电脑查看网页时 该图标不显示 我确信有更好的方法来使用 Twitter Bootstrap
  • 如何将 env 文件与 GitHub Actions 结合使用?

    我有多个环境 dev qa prod 并且我正在使用 env 文件来存储机密等 现在我要切换到 GitHub Actions 我想使用我的 env 文件并将它们声明到envgithub actions yml 的部分 但从我到目前为止所看到
  • 如何确定编解码器/容器组合是否与 FFmpeg 兼容?

    我正在考虑重新混合一些保存音频和视频的容器 以便提取最好的第一个音频流 并将其存储在一个新的容器中 例如only音频流存在 FFmpeg 的输出上下文是这样创建的 AVFormatContext output context NULL av
  • 如何将 var 添加到文本 javascript

    我有这个代码 ajax url http localhost record FlashWavRecorder master jjj r type HEAD error function sd html img src 5 0 gif suc
  • Keras 序列模型中使用哪种损失函数

    我使用的是 Keras 序列模型 预测输出的形状为 1 5 5 个特征 我有一个准确度指标定义如下 对于 N 个预测 模型的准确性将是预测样本的百分比 使得 对于每个预测及其各自的真实标签 所有特征的差异不超过 10 例如 如果y i 1
  • 从嵌套字典中删除字段的优雅方法

    我必须从字典中删除一些字段 这些字段的键在列表中 所以我写了这个函数 def delete keys from dict dict del lst keys Delete the keys present in lst keys from
  • SonarQube - 如何查看前 15 条以上的违规行为?

    我正在使用 SonarQube 5 3 我们的代码库中有 241k 个问题 但是 当我过滤掉 主要 问题并单击 规则 框查看违反了哪些规则时 我只能看到前 15 个 有没有办法可以找出所有这些问题 我已经编辑了这个问题以添加屏幕截图 请注意
  • 替换字符串中第 N 个位置的字符

    我想替换字符串中第 N 个位置的字符 这是我的查询 SELECT code FROM tablecodes 结果是 3 行 AXGETYTRTFYZUFYZFFFDIZEG GFYZUFYZFAXFCDIZAX ZUFYZGEFYFAXFF
  • 在 CakePHP 中添加好友功能

    我需要在我的应用程序中添加一个简单的朋友功能 通过一些研究 我需要一个链接回用户表的连接表 像这样的 我已经有一个用户表 用户 友谊 用户 谁能提供更多详细信息吗 友谊表应包含以下列 id Integer user from the use
  • AngularFire Loop 非规范化数据

    我有类别和子类别 数据的结构就像blog shows categories JF1RmYehtF3IoGN9xHG categoryId title Example subcategories JF1RmYehtF3IoGN239GJ su
  • Python 3 中如何区分实例方法、类方法、静态方法或函数?

    我想区分Python 3中的方法和函数 此外 如果是方法 我想获取相应的类 我目前的解决方案是这样的 import types import inspect def function or method f if inspect ismet
  • java.lang.NullPointerException:在可扩展列表视图中显示数据库中的记录

    正如问题所示 我需要显示数据库中的记录 每个孩子的记录不同 即 子1 记录1个数据 child 2 记录2数据 so等等 我想出了以下显示代码 package com example moolah import android app Li
  • knockoutjs 依赖选择框绑定子选择框的问题

    与knockout js购物车示例类似 我有一个包裹列表 价格取决于位置 我无法将依赖选择框 位置选项 与视图绑定
  • 为什么Spark的重新分区没有将数据平衡到分区中?

    gt gt gt rdd sc parallelize range 10 2 gt gt gt rdd glom collect 0 1 2 3 4 5 6 7 8 9 gt gt gt rdd repartition 3 glom col
  • ImageView 位图比例尺寸

    我有一个比我放入的 ImageView 更大的位图 我将 ScaleType 设置为 center inside 如何获得缩小图像的尺寸 好的 我可能应该更清楚 在将缩放位图绘制到屏幕上之前 我需要缩放位图的高度和宽度 以便我可以在正确的位
  • Grep 包含特定关键字的文本的整个段落

    我的目标是提取包含特定关键字的文本段落 不仅仅是包含关键字的行 而是整个段落 我的文本文件的规则是每个段落都以某种模式开头 例如 Pa0 该模式仅在段落开头在整个文本中使用 每个段落都以换行符结尾 例如 假设我有以下文本 Pa0 This
  • 为什么在 Azure 中进行缩放时不会调用 Stopping/OnStop?

    RoleEnvironment Stopping RoleEntryPoint OnStop 是not当我减少角色实例数时 要求死亡实例 他们are当实例重新启动或部署停止时调用 我做错了什么 或者在这种情况下我不需要清理 我有一个简单的辅