Мютекс между контейнерами докера
помогите пожалуйста. Описание проблемы: У меня есть микросервис который содержит логику кэширования в Redis. На сервере подняты множество экземпляров этого сервиса и они используют единый кэш. Если на все экземпляры поступает запрос на получение данных из кэша а данныч там нет то ВСЕ экземпляры отправляют запрос на получение данных в базу тем самым нагружая ее.
Решение проблемы. Решение проблемы состоит в том чтобы при запросе в базу установить блокировку между контейнерами через Mutex. Чтобы пока один экземпляр получает данные из базы и поместит их в кэш, другие экземпляры ждали на заблокированном мютексе и потом брали из кэша.
Вся логика уже реализована, единственная проблема в том чтобы создавался единый мютекс для всех контейнеров. Пол гугла перерыл - ноль инфы. Помогите пожалуйста.
Создание единого мютекса я пока что тестирую на консольном приложении.
Ниже предоставил самый стандартный DockerFile.
FROM mcr.microsoft.com/dotnet/runtime:7.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["MutexDockerTest/MutexDockerTest.csproj", "MutexDockerTest/"]
RUN dotnet restore "MutexDockerTest/MutexDockerTest.csproj"
COPY . .
WORKDIR "/src/MutexDockerTest"
RUN dotnet build "MutexDockerTest.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MutexDockerTest.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MutexDockerTest.dll"]
Ниже предоставлен код из Program.cs
Console.WriteLine("Start");
using (var mutex = new Mutex (false, "mutextUltra"))
{
if (!mutex.WaitOne (TimeSpan.FromSeconds (1), false))
{
Console.WriteLine ("Another app instance is running. Bye!");
Thread.Sleep(1000);
return;
}
RunProgram();
}
void RunProgram()
{
while (true)
{
Thread.Sleep(2000);
Console.WriteLine("Hello");
}
}
Ответы (1 шт):
Вам нужен system-wide mutex? https://learn.microsoft.com/en-us/dotnet/api/system.threading.mutex.-ctor?view=net-7.0#system-threading-mutex-ctor(system-boolean-system-string) секция Remarks:
The name may be prefixed with Global\ or Local\ to specify a namespace. When the Global namespace is specified, the synchronization object may be shared with any processes on the system. When the Local namespace is specified, which is also the default when no namespace is specified, the synchronization object may be shared with processes in the same session.