Skip to content

Commit cd042cd

Browse files
committed
Merge branch 'main' into release-postgres-flexible
2 parents bd56fcc + 7b7d495 commit cd042cd

File tree

3 files changed

+45
-61
lines changed

3 files changed

+45
-61
lines changed

articles/azure-cache-for-redis/cache-private-link.md

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ ms.author: franlanglois
77
ms.service: cache
88
ms.custom: devx-track-azurecli, devx-track-azurepowershell
99
ms.topic: conceptual
10-
ms.date: 12/15/2023
10+
ms.date: 01/12/2024
1111

1212
---
1313

@@ -30,9 +30,9 @@ You can restrict public access to the private endpoint of your cache by disablin
3030
3131
## Scope of availability
3232

33-
|Tier | Basic, Standard, Premium |Enterprise, Enterprise Flash |
34-
|---------|---------|---------|
35-
|Available | Yes | Yes |
33+
|Tier | Basic, Standard, Premium |Enterprise, Enterprise Flash |
34+
|--------- |:------------------:|:---------:|
35+
|Available | Yes | Yes |
3636

3737
## Prerequisites
3838

@@ -44,7 +44,7 @@ You can restrict public access to the private endpoint of your cache by disablin
4444
4545
> [!IMPORTANT]
4646
> When using private link, you cannot export or import data to a to a storage account that has firewall enabled unless you're using [managed identity to autenticate to the storage account](cache-managed-identity.md).
47-
> For more information, see [How to export if I have firewall enabled on my storage account?](cache-how-to-import-export-data.md#how-to-export-if-i-have-firewall-enabled-on-my-storage-account)
47+
> For more information, see [How to export if I have firewall enabled on my storage account?](cache-how-to-import-export-data.md#how-to-export-if-i-have-firewall-enabled-on-my-storage-account)
4848
>
4949
5050
## Create a private endpoint with a new Azure Cache for Redis instance
@@ -349,23 +349,27 @@ az network private-endpoint delete --name MyPrivateEndpoint --resource-group MyR
349349

350350
### How do I connect to my cache with private endpoint?
351351

352-
For **Basic, Standard, and Premium tier** caches, your application should connect to `<cachename>.redis.cache.windows.net` on port `6380`. A private DNS zone, named `*.privatelink.redis.cache.windows.net`, is automatically created in your subscription. The private DNS zone is vital for establishing the TLS connection with the private endpoint. We recommend avoiding the use of `<cachename>.privatelink.redis.cache.windows.net` in configuration or connection string.
352+
For **Basic, Standard, and Premium tier** caches, your application should connect to `<cachename>.redis.cache.windows.net` on port `6380`. A private DNS zone, named `*.privatelink.redis.cache.windows.net`, is automatically created in your subscription. The private DNS zone is vital for establishing the TLS connection with the private endpoint. We recommend avoiding the use of `<cachename>.privatelink.redis.cache.windows.net` in configuration or connection string.
353353

354-
For **Enterprise and Enterprise Flash** tier caches, your application should connect to `<cachename>.<region>.redisenterprise.cache.azure.net` on port `10000`.
354+
For **Enterprise and Enterprise Flash** tier caches, your application should connect to `<cachename>.<region>.redisenterprise.cache.azure.net` on port `10000`.
355355

356356
For more information, see [Azure services DNS zone configuration](../private-link/private-endpoint-dns.md).
357357

358358
### Why can't I connect to a private endpoint?
359359

360-
- Private endpoints can't be used with your cache instance if your cache is already using the VNet injection network connection method.
361-
- You have a limit of one private link for clustered caches. For all other caches, your limit is 100 private links.
362-
- You try to [persist data to a storage account](cache-how-to-premium-persistence.md) with firewall rules and you're not using managed identity to connect to the storage account.
360+
- Private endpoints can't be used with your cache instance if your cache is already a VNet injected cache.
361+
362+
- On Premium tier caches, you have a limit of one private link for clustered caches. Enterprise and Enterprise Flash tier caches do not have this limitation for clustered caches. For all other caches, your limit is 100 private links.
363+
364+
- You try to [persist data to storage account](cache-how-to-premium-persistence.md) where firewall rules are applied might prevent you from creating the Private Link.
365+
363366
- You might not connect to your private endpoint if your cache instance is using an [unsupported feature](#what-features-arent-supported-with-private-endpoints).
364367

365368
### What features aren't supported with private endpoints?
366369

367370
- Trying to connect from the Azure portal console is an unsupported scenario where you see a connection failure.
368-
- Private links can't be added to Premium tier caches that are already geo-replicated. To add a private link to a cache using [passive geo-replication](cache-how-to-geo-replication.md): 1. Unlink the geo-replication. 2. Add a Private Link. 3. Last, relink the geo-replication.
371+
372+
- Private links can't be added to caches that are already using [passive geo-replication](cache-how-to-geo-replication.md) in the Premium tier. To add a private link to a geo-replicated cache: 1. Unlink the geo-replication. 2. Add a Private Link. 3. Last, relink the geo-replication. (Enterprise tier caches using [active geo-replication](cache-how-to-active-geo-replication.md) do not have this restriction.)
369373

370374
### How do I verify if my private endpoint is configured correctly?
371375

@@ -398,6 +402,7 @@ You can also change the value through a RESTful API PATCH request. For example,
398402
}
399403
400404
```
405+
401406
For more information, see [Redis - Update](/rest/api/redis/Redis/Update?tabs=HTTP).
402407

403408
### How can I migrate my VNet injected cache to a Private Link cache?

articles/expressroute/provider-rate-limit.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: About rating limiting for ExpressRoute circuits over service provider ports
2+
title: About rate limiting for ExpressRoute circuits over service provider ports
33
titleSuffix: Azure ExpressRoute
44
description: This document discusses how rate limiting works for ExpressRoute circuits over service provider ports. You'll also learn how to monitor the throughput and traffic drop due to rate limiting.
55
services: expressroute
@@ -10,19 +10,19 @@ ms.date: 01/12/2024
1010
ms.author: duau
1111
---
1212

13-
# About rating limiting for ExpressRoute circuits over service provider ports
13+
# About rate limiting for ExpressRoute circuits over service provider ports
1414

1515
This article discusses how rate limiting works for ExpressRoute circuits created over service provider ports. You'll also learn how to monitor the throughput and traffic drop due to rate limiting.
1616

1717
## How does rate limiting work over an ExpressRoute circuit?
1818

19-
An ExpressRoute circuit consists of two links that connects the Customer/Provider edge to the Microsoft Enterprise Edge (MSEE) routers. If your circuit bandwidth is 1 Gbps and you distribute your traffic evenly across both links, you can achieve a maximum throughput of 2 Gbps (two links * 1 Gbps). Rate limiting restricts your throughput to the configured bandwidth if you exceed it on either link. The ExpressRoute circuit SLA is only guaranteed for the bandwidth that you configured. For example, if you purchased a 1-Gbps circuit, you're SLA is for a maximum throughput of 1 Gbps.
19+
An ExpressRoute circuit consists of two links that connects the Customer/Provider edge to the Microsoft Enterprise Edge (MSEE) routers. If your circuit bandwidth is 1 Gbps and you distribute your traffic evenly across both links, you can achieve a maximum throughput of 2 Gbps (two times 1 Gbps). Rate limiting restricts your throughput to the configured bandwidth if you exceed it on either link. The ExpressRoute circuit SLA is only guaranteed for the bandwidth that you configured. For example, if you purchased a 1-Gbps circuit, your SLA is for a maximum throughput of 1 Gbps.
2020

2121
:::image type="content" source="./media/provider-rate-limit/circuit.png" alt-text="Diagram of rate limiting on an ExpressRoute circuit over provider ports.":::
2222

2323
## How can I determine what my circuit throughput is?
2424

25-
You can monitor the ingress and egress throughput of your ExpressRoute circuit for both links through the Azure portal using ExpressRoute circuit metrics. For ingress, select `BitsInPerSecond` and for egress, select `BitsOutPerSecond`. The following screenshot shows the ExpressRoute circuit metrics for ingress and egress throughput.
25+
You can monitor the ingress and egress throughput of your ExpressRoute circuit for both links through the Azure portal using ExpressRoute circuit metrics. For ingress, select `BitsInPerSecond` and for egress, select `BitsOutPerSecond`. The following screenshot shows the ExpressRoute circuit metrics for ingress and egress throughput.
2626

2727
:::image type="content" source="./media/provider-rate-limit/throughput-metrics.png" alt-text="Screenshot of the throughput per seconds metrics for an ExpressRoute Direct circuit.":::
2828

@@ -38,8 +38,8 @@ You can seamlessly increase your circuit bandwidth through the Azure portal. For
3838

3939
## What are the causes of traffic drop when the throughput is below the configured bandwidth?
4040

41-
ExpressRoute circuit throughput is monitored at an aggregate level of every few minutes. While the rate-limiting is enforced at a granular level in milliseconds. Therefore, occasional traffic bursts exceeding the configured bandwidth might not get detected by the throughput monitoring. However, the rate-limiting is still be enforced and traffic gets dropped.
41+
ExpressRoute circuit throughput is monitored at an aggregate level of every few minutes, while the rate limiting is enforced at a granular level in milliseconds. Therefore, occasional traffic bursts exceeding the configured bandwidth might not get detected by the throughput monitoring. However, the rate limiting is still be enforced and traffic gets dropped.
4242

4343
## Next steps
4444

45-
For more frequently asked questions, see [ExpressRoute FAQ](expressroute-faqs.md).
45+
For more frequently asked questions, see [ExpressRoute FAQ](expressroute-faqs.md).

articles/notification-hubs/export-modify-registrations-bulk.md

Lines changed: 23 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ This section assumes you have the following entities:
4444
An input file contains a list of registrations serialized in XML, one per row. Using the Azure SDK, the following code example shows how to serialize the registrations and upload them to blob container:
4545

4646
```csharp
47-
private static void SerializeToBlob(BlobContainerClient container, RegistrationDescription[] descriptions)
47+
private static async Task SerializeToBlobAsync(BlobContainerClient container, RegistrationDescription[] descriptions)
4848
{
4949
StringBuilder builder = new StringBuilder();
5050
foreach (var registrationDescription in descriptions)
@@ -55,7 +55,7 @@ private static void SerializeToBlob(BlobContainerClient container, RegistrationD
5555
var inputBlob = container.GetBlobClient(INPUT_FILE_NAME);
5656
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(builder.ToString())))
5757
{
58-
inputBlob.UploadAsync(stream);
58+
await inputBlob.UploadAsync(stream);
5959
}
6060
}
6161
```
@@ -74,16 +74,12 @@ static Uri GetOutputDirectoryUrl(BlobContainerClient container)
7474
BlobSasBuilder builder = new BlobSasBuilder(BlobSasPermissions.All, DateTime.UtcNow.AddDays(1));
7575
return container.GenerateSasUri(builder);
7676
}
77-
78-
79-
8077

8178
static Uri GetInputFileUrl(BlobContainerClient container, string filePath)
8279
{
8380
Console.WriteLine(container.CanGenerateSasUri);
8481
BlobSasBuilder builder = new BlobSasBuilder(BlobSasPermissions.Read, DateTime.UtcNow.AddDays(1));
8582
return container.GenerateSasUri(builder);
86-
8783
}
8884
```
8985

@@ -93,23 +89,19 @@ With the two input and output URLs, you can now start the batch job.
9389

9490
```csharp
9591
NotificationHubClient client = NotificationHubClient.CreateClientFromConnectionString(CONNECTION_STRING, HUB_NAME);
96-
var createTask = client.SubmitNotificationHubJobAsync(
97-
new NotificationHubJob {
98-
JobType = NotificationHubJobType.ImportCreateRegistrations,
99-
OutputContainerUri = outputContainerSasUri,
100-
ImportFileUri = inputFileSasUri
101-
}
102-
);
103-
createTask.Wait();
92+
var job = await client.SubmitNotificationHubJobAsync(
93+
new NotificationHubJob {
94+
JobType = NotificationHubJobType.ImportCreateRegistrations,
95+
OutputContainerUri = outputContainerSasUri,
96+
ImportFileUri = inputFileSasUri
97+
}
98+
);
10499

105-
var job = createTask.Result;
106100
long i = 10;
107101
while (i > 0 && job.Status != NotificationHubJobStatus.Completed)
108102
{
109-
var getJobTask = client.GetNotificationHubJobAsync(job.JobId);
110-
getJobTask.Wait();
111-
job = getJobTask.Result;
112-
Thread.Sleep(1000);
103+
job = await client.GetNotificationHubJobAsync(job.JobId);
104+
await Task.Delay(1000);
113105
i--;
114106
}
115107
```
@@ -135,18 +127,9 @@ The following sample code imports registrations into a notification hub.
135127

136128
```csharp
137129
using Microsoft.Azure.NotificationHubs;
138-
using Microsoft.WindowsAzure.Storage;
139-
using Microsoft.WindowsAzure.Storage.Blob;
140-
using System;
141-
using System.Collections.Generic;
142-
using System.Globalization;
143-
using System.IO;
144-
using System.Linq;
145-
using System.Runtime.Serialization;
130+
using Azure.Storage.Blobs;
131+
using Azure.Storage.Sas;
146132
using System.Text;
147-
using System.Threading;
148-
using System.Threading.Tasks;
149-
using System.Xml;
150133

151134
namespace ConsoleApplication1
152135
{
@@ -158,7 +141,7 @@ namespace ConsoleApplication1
158141
private static string STORAGE_ACCOUNT_CONNECTIONSTRING = "connectionstring";
159142
private static string CONTAINER_NAME = "containername";
160143

161-
static void Main(string[] args)
144+
static async Task Main(string[] args)
162145
{
163146
var descriptions = new[]
164147
{
@@ -168,45 +151,41 @@ namespace ConsoleApplication1
168151
new MpnsRegistrationDescription(@"http://dm2.notify.live.net/throttledthirdparty/01.00/12G9Ed13dLb5RbCii5fWzpFpAgAAAAADAQAAAAQUZm52OkJCMjg1QTg1QkZDMdUxREQFBlVTTkMwMQ"),
169152
};
170153

171-
// Get a reference to a container named "sample-container" and then create it
154+
// Get a reference to a container named "sample-container" and then create it
172155
BlobContainerClient container = new BlobContainerClient(STORAGE_ACCOUNT_CONNECTIONSTRING, CONTAINER_NAME);
173156

174-
container.CreateIfNotExistsAsync();
157+
await container.CreateIfNotExistsAsync();
175158

176-
SerializeToBlob(container, descriptions);
159+
await SerializeToBlobAsync(container, descriptions);
177160

178161
// TODO then create Sas
179162
var outputContainerSasUri = GetOutputDirectoryUrl(container);
180163

181-
BlobContainerClient inputfilecontainer = new BlobContainerClient(STORAGE_ACCOUNT_CONNECTIONSTRING, STORAGE_ACCOUNT_CONNECTIONSTRING + "/" + INPUT_FILE_NAME);
164+
BlobContainerClient inputcontainer = new BlobContainerClient(STORAGE_ACCOUNT_CONNECTIONSTRING, STORAGE_ACCOUNT_CONNECTIONSTRING + "/" + INPUT_FILE_NAME);
182165

183166
var inputFileSasUri = GetInputFileUrl(inputcontainer, INPUT_FILE_NAME);
184167

185168

186169
// Import this file
187170
NotificationHubClient client = NotificationHubClient.CreateClientFromConnectionString(CONNECTION_STRING, HUB_NAME);
188-
var createTask = client.SubmitNotificationHubJobAsync(
171+
var job = await client.SubmitNotificationHubJobAsync(
189172
new NotificationHubJob {
190173
JobType = NotificationHubJobType.ImportCreateRegistrations,
191174
OutputContainerUri = outputContainerSasUri,
192175
ImportFileUri = inputFileSasUri
193176
}
194177
);
195-
createTask.Wait();
196178

197-
var job = createTask.Result;
198179
long i = 10;
199180
while (i > 0 && job.Status != NotificationHubJobStatus.Completed)
200181
{
201-
var getJobTask = client.GetNotificationHubJobAsync(job.JobId);
202-
getJobTask.Wait();
203-
job = getJobTask.Result;
204-
Thread.Sleep(1000);
182+
job = await client.GetNotificationHubJobAsync(job.JobId);
183+
await Task.Delay(1000);
205184
i--;
206185
}
207186
}
208187

209-
private static void SerializeToBlob(BlobContainerClient container, RegistrationDescription[] descriptions)
188+
private static async Task SerializeToBlobAsync(BlobContainerClient container, RegistrationDescription[] descriptions)
210189
{
211190
StringBuilder builder = new StringBuilder();
212191
foreach (var registrationDescription in descriptions)
@@ -217,7 +196,7 @@ namespace ConsoleApplication1
217196
var inputBlob = container.GetBlobClient(INPUT_FILE_NAME);
218197
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(builder.ToString())))
219198
{
220-
inputBlob.UploadAsync(stream);
199+
await inputBlob.UploadAsync(stream);
221200
}
222201
}
223202

0 commit comments

Comments
 (0)