每天晚上11点UTC处理Cosmosdb ChangeFeedProcesser

时间:2019-06-25 23:46:57

标签: azure azure-cosmosdb

我有一个Azure Service Fabric应用程序,该应用程序具有实例化和监视CosmosDB Change提要的辅助角色。我试图使其每天结束时每天运行一次。

一切正常,除了让它只能在任何特定时间运行一次。

我目前正在将FeedPollDelay设置为1天,但是由于延迟是基于上一次扫描的完成而来的,因此它会缓慢爬网。这也没有解决开始时间。

我也使用了“开始时间”选项,但是无论我设置了什么时间,它都会立即开始处理。

std::string getWaveHeader(int data_size_bits, int channels, int sample_rate) {
    char header[] = 
    "RIFF"  // Chunk ID
    "\x00\x00\x00\x00"  // Chunk size (not set)
    "WAVE"  // WAVE ID
    "fmt "  // Chunk ID
    "\x28\x00\x00\x00" // [little-endian] WAVE header size (40)
    "\xfe\xff"  // [little-endian] WAVE format code: WAVE_FORMAT_EXTENSIBLE
    "\x00\x00"  // number of channels (not set)
    "\x00\x00\x00\x00"  // sample rate (not set)
    "\x00\x00\x00\x00"  // average bytes/sec (not set)
    "\x00\x00"  // block size (not set)
    "\x00\x00"  // bits per sample (not set)
    "\x16\x00"  // [little-endian] size of extension (22)
    "\x00\x00"  // valid bits (not set)
    "\x00\x00\x00\x00"  // speaker position mask (not set)
    "\x03\x00\x00\x00"   // WAV_HEADER_SUB_FORMAT_CODE
    "\x00\x00\x10\x00"   // WAV_HEADER_SUB_GUID
    "\x80\x00\x00\xaa"   // WAV_HEADER_SUB_GUID
    "\x00\x38\x9b\x71"   // WAV_HEADER_SUB_GUID
    "fact"  // Chunk ID
    "\x04\x00"  // [little-endian] Chunk size (4)
    "\x00\x00\x00\x00"  // dwSample Length (not set)
    "data"  // Chunk ID
    "\x00\x00\x00\x00";  // Wav header size (not set)

    // modifications on |header| ....
    // ...
    // Set the following params in little-endian using given information.
    // 1. Chunk size: |data_size_bits| + |header_size_bits| - 8
    // 2. number of channels (given)
    // 3. sample rate (given)
    // 4. average bytes/sec: |sample rate| * |bit_per_sample|/8 * |channels|
    // 5. block size: |bit_per_sample|/8 * |channels|
    // 6. bits per sample (given)
    // 7. valid bits: |bit_per_sample|
    // 8. Wav header size: |data_size_bits|

    std::string header_str = ConvertToString(header);

    return header_str;
}

1 个答案:

答案 0 :(得分:1)

StartTimeStartFromBeginning仅在根据official docs的租约集合为空的情况下有效。

假设您要在UTC晚上11点运行,可以通过一些在11 PM UTC调用StartAsync的工作线程或进程轻松实现这一点,而要停止它,只需调用StopAsync。

如果要在耗尽所有待处理的更改后立即停止它,则可以使用Estimator来衡量集合的当前状态与更改提要处理器之间的当前增量。您可以使用Estimator来每隔X的时间检查一次有多少待处理的更改,当更改达到0时,只需在处理器上调用StopAsync

遵循以下原则:

public async Task StartProcessorAsync()
{
    ChangeFeedProcessorBuilder builder = new ChangeFeedProcessorBuilder();
    //setup builder

    IChangeFeedProcessor processor = await builder.BuildAsync();
    await processor.StartAsync();

    await MeasureAndStopAsync(processor);
}


public async Task MeasureAndStopAsync(IChangeFeedProcessor processor)
{
    ChangeFeedProcessorBuilder builderForEstimator = new ChangeFeedProcessorBuilder();
    //setup builder just like for processor, same lease collection configuration

    IRemainingWorkEstimator estimator = await builderForEstimator.BuildEstimatorAsync();
    do
    {
        await Task.Delay(60000); // 1 minute
        long pendingChanges = await estimator.GetEstimatedRemainingWork();            
    }
    while(pendingChanges > 0);

    // Job's done
    await processor.StopAsync();
}