ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 419
Obunachilar
Ma'lumot yo'q24 soatlar
-17 kunlar
+230 kunlar
Postlar arxiv
1 419
# ืฆืขืืื ืจืืฉืื ืื ืขื grpc
ืกืคืจืืืช gRPC ืืื ืกืคืจืืืช ืงืื ืคืชืื ืืืืช ืืืื ืฉืชืคืงืืื ืืืืจ ืืื ืกืจืืืกืื ืืืขืจืืช ืฉืืื ืืฆืืจื ืืขืืื ืืืืืจื. ืืคืฉืจ ืืืฉืื ืขืืื ืืชืืจ ืชืืืืฃ ืืืืจ ืืืชืจ ื REST APIs ืืืฉืจ ืืจืืื ืืืจืืื ืฉื gRPC ืืืืื ืช ืืืฆืืขืื ืืืืข ืืืฉืืืืฉ ื HTTP/2 ืืืฉืืืื ืืืื ืืืชืจ ืฉื ืืกืคืจืื ืืคืจืืืืงืื. ืืืืื ืช ืืืืืช ืืฉืชืืฉ ืืกืคืจืื ืืืคืฉืจืช ืืชืืืช ืชืืื ืืืช ืืืืืจืืช ืืืืื ืื ืื ื ืจืฆืื ืขื ืืืชื ืืืื ื ืืืืฆืขืืช ืฉืืืืฉ ื ืจืื ื Stub-ืื.
ืืกืคืจืื ืืืืขื ืขื ืชืืืื ืจืฉืืืช ื 11 ืฉืคืืช ืชืื ืืช ืืืคืฉืจ ืืืฆืื ืืืืืจืื ืืขืื ืขืฉืจืืช ืืืืคืืฉ ืคืฉืื ืืจืฉืช. ืืคืืกื ืื ืืฆืื ืฉืชื ืืืืืืืช ืืฉืคืช Python ืืฉืืืืฉ ื gRPC ืืืชืืื ืืื ืืืชืื ืฉืจืช Echo ืืืืืจ ืืื ืืืคืื ืืืชื ื Chat.
## ืืชืงื ื
ืืื ืื ืฉืืฉ ืืื python3 ืืงืื ืคื ืืื ืฉืฆืจืื ืืคืฉืจ ืืืชืงืื ืืื ืขื ืคืงืืืช pip ืคืฉืืื:
$ pip install grpclib protobuf grpcio-tools
ืืืชืืืช ืงืื gRPC ืื ืื ื ืืชืืืืื ืืืชืืืช ืงืืืฅ ืคืจืืืืงืื (ืขื ืกืืืืช proto) ืืื ืืฉืชืืฉืื ืืฉืคื ืฉืืืจื ื ืืื ืืืฆืืจ ืงืื ืกืืื ืขืืืจ ืืคืจืืืืงืื ืืคืจืืืงื ืฉืื ื. ืื ืืืืจ ืฉืืื ืงืืืฅ ืคืจืืืืงืื ืืืื ืื ื ืฉื ื ืงืืฆืื ืื'ืื ืจืืื ืืืชื ื ืืขื ืืืงืื, ืืื ืคืขื ืฉืืฉื ืื ืืช ืืคืจืืืืงืื ืฆืจืื ืืืคืขืื ืืืืฉ ืืช ืืคืงืืื ืฉืืืืฆืจืช ืืช ืืืชื ืฉื ื ืงืืฆืื.
ืงืืืฅ ืคืจืืืืงืื ืฉื gRPC ืืชืืจ ืืช ืืชืงืฉืืจืช ืืื ืืฉืจืช ืืืงืื - ืืืืจืืื ืืืืืื ืืืืช ืืืงืื ืคืื ื ืืฉืจืช ืืืืงืฉ ืืืจืืฅ ืงืื ืืกืืื, ืืฉืจืช ืืจืืฅ ืืช ืืงืื ืืฉืืื ืืืจื ืชืฉืืื. ืคืจืืืืงืื ืืชืงืฉืืจืช ืืืจืื ืืจืฉืืืช ืืคืื ืงืฆืืืช ืฉืืฉืจืช ืืืื ืืืคืขืื ืืจืฉืืืช ืืคืจืืืจืื ืฉื ืื ืคืื ืงืฆืื.
## ืชืืื ืืช ืจืืฉืื ื: ืฉืจืช Echo
ืื ื ืืืืืื ืชืืื ืืช ืจืืฉืื ื ืชืืื ืชืืื ืืช Echo, ืืืืืจ ืชืืื ืื ื ืคืื ืงืฆืื ืืืช ืขื ืืฉืจืช ืฉืืกื ืืื ืชืฉืื ืืืงืื ืืืจื ืืืืืง ืืช ืื ืฉืืื ืฉืื ืืืื. ืงืืืฅ ืืคืจืืืืงืื ืฉื ืืชืืื ืืช ืืื:
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string text = 1;
}
message HelloReply {
string message = 1;
}
ืืชืจืืื ืืขืืจืืช:
1. ืืืืื service ืืืืืจื ืืืกืฃ ืคืขืืืืช ืฉืฉืจืช ืืืืข ืืขืฉืืช (ืืคืฉืจ ืืืฉืื ืขื ืื ื Class ืืฉืจืช).
2. ืืืืื message ืืืืืจื ืืืืขื ืฉืคืขืืื ืืืืขืช ืืงืื ืื ืืืืืืจ.
3. ืืชืื message ืืคืฉืจ ืืืชืื ืืกืคืจ ืฉืืืช ืฉืืืื ืืืืืขื. ืืื ืฉืื ืืฉ ืืกืคืจ ืืกืื.
ืืืืืื ืฉืื ื ืืืืืงื ืขื ืืฉืจืช ื ืงืจืืช Greeter ืืืื ืืืฉืคืช ืคืื ืงืฆืื ืืืช ืืฉื SayHello. ืคืื ืงืฆืื ืื ืืงืืืช ืืืืขื ืืกืื HelloRequest ืืืืืืจื ืืืืขื ืืกืื HelloReply.
ืฉืชื ืืืืืขืืช ืืืืืจืืช ืืืืฉื ืืงืืืฅ, ืืฉืชืืื ืฉืื ืืื ืืกืื ืืงืกื ืืื ืขื ืฉื ืฉืื ื.
ืืืืืื ืืืืช ืืื ืืงืืจืืื ืืืืื ืื ืืืฆืื ืืช ืืืืจืืืช ืืืืืืช ืืืชืืืช ืงืืฆื proto ืืชืืขืื ืฉืืื ืืงืืฉืืจ: https://developers.google.com/protocol-buffers/docs/proto3.
ืืืจื ืฉืืชืื ื ืืช ืงืืืฅ ื proto ืื ืื ื ืฆืจืืืื ืืืืฆืจ ืืื ื ืืช ืงืืฆื ืืกืืื. ืืคืืืชืื ืื ื ืจืืฉื ืืฉืืจืช ืืคืงืืื:
$ python -m grpc_tools.protoc -I. --python_out=. --grpclib_python_out=. sayhello.proto
ืื ืืืฆืืจ ืืช ืืงืืฆืื sayhello_grpc.py ื sayhello_pb2.py, ืฉื ืืื ืื ื ืืขืื ืืื ื ืืื. ืื ืื ื ืคืฉืื ื ืฉืื ืืืชื ืืชืืื ืืช ื Python ืฉืื ื ืืื ืืืืจ ืืื ืืฉืจืช ืืืงืื.
ืืฉืืื ืืื ืืช ืงืื ืฆื ืฉืจืช gRPC ืื ื ืฆืจืื ืืืืืืจ ืืืืงื ืฉืชืืืฉ ืืช ืืคืื ืงืฆืืืช ืฉืืืืจืชื ืืคืจืืืืงืื. ืื ื ืืฉืชืืฉ ืืืกืืก ืฉื ืืฆืจ ืขืืืจื ืืงืืืฅ sayhello_grpc.py ืืืจืืื ืืืชื. ืืืืงืช ืฆื ืฉืจืช ื ืจืืืช ืื:
class Greeter(GreeterBase):
async def SayHello(self, stream):
request = await stream.recv_message()
message = f'You Said: "{request.text}"'
await stream.send_message(HelloReply(message=message))
ืืคืื ืงืฆืื SayHello ืืชืืืื ืืคืื ืงืฆืื ืฉืืืืจืชื ืืงืืืฅ ืืคืจืืืืงืื. ืืคืจืืืจ stream ืืื ืฉืืืคืฉืจ ืื ืืืฆืข ืคืขืืืืช ืืงืฉืืจืืช ืืคืจืืืืงืื ืืืืงืจื ืฉืื ื stream.recv_message() ืืงืืืช ืืช ืืืงืฉื ืืืืงืื ื stream.send_message ืฉืืืืช ืืช ืืชืฉืืื. ืื ืืื ื ืืขื ืืื ืื ืืืจื ืืื ืื ืื ื ืืืฉืืื ืขื ืคืื ืงืฆืื ืืชืืจ ืืฉืื ืฉ"ืืืืืจ" ืขืจื, ืืคื ืืืื ืฉืืืืืจ ืืคืขืืื ืืืืืจืช ืืืืจืช ืืขืจื ืืื ืืืขืฉื ืฉืืืืช ืืืืขื ืืืจื ืขื ืืขืจื ืืืืืจ, ืืืงืื ืคืงืืืช return.
ืงืื ืฆื ืืฉืจืช ืืืื ืขื ืืงืื ืฉืืคืขืื ืืช ืืืืืงื ื ืจืื ืื:
# File: server.py
import asyncio
from grpclib.utils import graceful_exit
from grpclib.server import Server
# generated by protoc
from sayhello_pb2 import HelloReply
from sayhello_grpc import GreeterBase
class Greeter(GreeterBase):
async def SayHello(self, stream):
request = await stream.recv_message()
message = f'You Said: "{request.text}"'1 419
# ืืืืจืืช - ืงืื ืขืืื ืืคื ืื!
ืืืื ืืื ืืจืืข ืืืืืืช ืงืื ืืื "ืขืืื/ืื ืขืืื" ืืื ื ืชืืื ืืขืืืฃ ืงืื ื ืืื ืฉืื ืขืืื ืขื ืคื ื ืงืื ืขืืื ืืื ื ืืื. ืืขื ืื ืืืืชื ืืงืฉืงืฉ ืงืฆืช ืขื JavaScript ืืืื ืืืคืจื ืขื testing-library. ืฉืืื ืื ืืืืืงื ืืืื ืฉืขืืืจืช:
it('Increases after I click the button', async () => {
const screen = render(Counter);
const button = screen.getByRole('button', { name: 'Click Here' });
await userEvent.click(button);
expect(screen.getByText(/clicked 1 times/)).toBeTruthy();
});
ืื ืงืื ืืืืงื ืืืื ื ืืืืฆืืช ืฉืืืืื ืฉืืืจื ืฉืืืฆืชื ืขื ืืคืชืืจ ืืืคืืข ืืืงืกื clicked 1 times.
ืืื ืืขืื ืฉืืื ืืงืืจืืื ืืืืืื ืืจืืืช ืืช ืืืขืื ืืฉืืจื ืืจืืืขืืช ืฉื ืืงืื:
await userEvent.click(button);
ืื ืจืขืืื ืืคื ืจืง ืฉ userEvent.click ืื ืืืืืจ Promise. ืงืื ืืืืืงื ืืื (ืฉืื ืขืืื) ืืื ืฉืงืื ืืชืืื ืืช ืืจืืฉืื ื:
it('Increases after I click the button', async () => {
const screen = render(Counter);
const button = screen.getByRole('button', { name: 'Click Here' });
userEvent.click(button);
await undefined;
expect(screen.getByText(/clicked 1 times/)).toBeTruthy();
});
ืื ืืฆืจืื ืืฆืืื - ืื ืืืืงืื ืืช ืฉืืจืช ื await ืื ืฉืืจืื ืจืง ืขื ืื:
it('Increases after I click the button', async () => {
const screen = render(Counter);
const button = screen.getByRole('button', { name: 'Click Here' });
userEvent.click(button);
expect(screen.getByText(/clicked 1 times/)).toBeTruthy();
});
ืืืืืงื ื ืืฉืืช.
ืืืขืฉื ืืงืจืืื ื await undefined, ืืืืืง ืืื ืืืจืกื ืืืืกืกืช ืืืืืืช ืฉื setTimeout(0) ืืื ืืจื ืืคืฆื ืืช ืืคืื ืงืฆืื ืืฉื ื ืืืงืื ืืืชืช ืืื ืืข "ืื ืฉืื" ืืื ืฉื ืืื ืืื ืฉืืื ืืืื ืืกืืื ืคืขืืืืช ืืกืื ืืจืื ืืืช ืืืจืืช. ืืื ืจืง ืขื ืืื ืฉื ืืื ืืฉื ืืืืืฉ ืื ืืข JavaScript ืกืคืฆืืคื ืืืืื ืืงืื ืืื ืขืื.
ืื ืฆืจืื ืืืงืื? ืืืืื ืฉืืืขืื ืืื ืื ื click ืืื ืืืื ืฉ Vue ืฆืจืื ืืืจื ื click ืืื ืืขืืื ืืช ืืืืฉืง, ืืืืืกืืฃ ืืช ืืืืชื ื ืืฉืืจื ืืืื ืฉืืืคืฉืช ืืช ืืืืื ื. ืงืื ืืจืืจ ืื ืืื ืืืชืจ ืืืืชื ืืืืงื ืืจืื ืื:
it('Increases after I click the button', async () => {
const screen = render(Counter);
const button = screen.getByRole('button', { name: 'Click Here' });
userEvent.click(button);
expect(screen.findByText(/clicked 1 times/)).toBeTruthy();
});1 419
# ืขืืฉื ืื ืฆืจืืช
ืืฃ ืคืขื ืื ืืฆืืืชื ืืืืื ืืื ืืื ืืืืืืืช ืืกืืืืืช ื ืจืื ืื ืืืฉืืืืช ืืืฉื ืื ืืจืืฉืื ื ืืืชื (ืืืืงืกืืจ, ืืื, ืคืจื), ืืืืจืืช (ืืื, ืคืืืชืื, ืงืืืจื ืืก) ืขืฉื ืื ืืฉืง ืืืชืืื ืืืืืจื ืืืื ืกืืข ืขื ืฉืืืจื ื ืืขืืืจ ืืื ืืขืืื ืืืขืืื. ืืื ืื ืืืฆื ืืื ื ืืืื ืฉืื ืืชื ืืืืจืื ืืช ืฉืชื ืืชืืืฉืืช.
ืขื ืืชืืืฉื ืืจืืฉืื ื ืืื ืืขืื - ืืช ืืชืืขืื ืืืืชืจ ืฉื ืืืืงืกืืจ ืงืจืืชื ืชืื ืืื ื ืกืืขื ืืืืืืืืก. ืืื ืืื ืคืฉืื ื ืชืงืืชื ืืืฉืื ืขื ืืืืงืกืืจ ืขืื ืืฉืืืืืชื ืืชืื ื ืืืฉืืืืข ืืืืืืืืก ืื ืืืจ ืืื ืืืืืจ ืืื ืืืคืกืืง. ืื ื ืืืฉื ืฉืืขืืจืชื ืืช ืจืื ืืืชื ืืืืื ืืืชืืืช ืืชืืื ืืืช ืืจืืฉืื ืืช.
ืืชืืืฉื ืืฉื ืื ืื ืกืืคืืจ ืืืจ - ืืฉืืื ืงืืืง ืืืื ืืืืืื ืืืงื ืืจืื ืืืชืจ ืืื ืืืื ืืืฆืื ืืช ืืืื ืืื ืืืืื ืืืชื, ืืื ืืืืืื ืืจืื ืคืืืช ืืคืงืืืื. ืงืฆื ืืืชืงืืืืช ืืืื ืืืืืื ืืืืช ืืืื ืืืืืช ืืืื ืคื 2 ืื 3, ืืจืง ืืืื ืืืื ืจืืฉื ืจืืฉืื ื ืื State Of Mind ืื ื ืืื.
ืืืจืืข ืฉืจืืืื ืืช ืื ืืคืืชืจืื ืคืฉืื: ืืืงืื ืืืืจืื ืืช ืขืฆืื ืืืืื ืืื ืืืืืื ืฉืขืืฉื ืื ืฆืจืืช, ืขืืืฃ ืืืฆืื ืืช ืืืจื ืืืชืืื ืืืื ืืืืืื (ืื ืื ืื ืืืงื ืืื), ืืงืจืื ืขืืื ืืืชืจ, ืืฉืืืข ืืจืฆืืืช ืืื ืกืื, ืืืืื ืื ืื ืฉืื ืืืจืื ืืืฆืืื ืืื ืฉืืืื ืื ืืช ืชืืืื; ืืคืืื ืืฉืงืขื ืฉื ืืื ืืืืฉืื ืจืง ืืฉืืืจืช ืืืืกืื ืืคืกืืืืืืื ืชืืืืจ ืืช ืขืฆืื ืืืจ ืืืื ืืืื ืืืืื ืงืฆืจ ืืืคืงืืืื ืืืจืื.
1 419
# ืืฉืืชื ืฉืืฆืืื ืืืกืชืืจ ืืื
ืืฉืืชื ืฉืืฆืืื ืืืกืชืืจ ืืื ืืืขืช ืขื ืืกืืฃ ืืื z-index ืขืืื. ืื ืคืขื ืฉื ืชืงืขืชื ืืืขืื ืืืชื ืืชืืขืื ืืื ื ืจืื ืื ืืจืื ืืืชืจ ืืื ืืจืื ืืืื ืื ืืืชืจ ืงื ืืืคืฉ ืคืืชืจืื ืกืคืฆืืคื ื Stack Overflow ืืืขืื ืฉืื.
ืืฉืืชื ืฉืืฆืืื ืืืกืชืืจ ืืื ืืืืื ืขื ืืกืืฃ SQL. ืืืืื ืืฆืื ื ืืฆืืืช ืขืืืืื ืขื ORM ืืืงืื ืฉืื ื ืืืชื ืืชืืจืื ืืืืืืืืช ืืฉืืืืชืืช.
ืืฉืืชื ืฉืืฆืืื ืืืกืชืืจ ืืื ืืืืื ืขื ืืกืืฃ ืืช ืืขืจืืช ืืืจืฉืืืช ืฉื AWS. ืชืืื ืืคืฉืจ ืืืืกืืฃ ืขืื ืืจืฉืืืช ืขื ืฉืืืจืื ืืชืืืืื ืืขืืื.
ืื ืืฉืืชื.
ืืื ืืืฆืืื ืืืกืชืืจ ืื ืื ืืืฆืืื ืืืชืื ืืขืจืืช: ืืช ืงืื ื CSS ืืืกืืจืื ืฉืืชืืชื ืืฃ ืืื ืืืจ ืื ืืฆืืื ืืืฆืื. ืืืื ืืืืฆืืขืื ืืืจืืขืื ืฉื ืืฉืืืืชืืช ืฉืื ืฆืจืื ืืฉืืชื ืืืขื ืืช ืื ืืฉืจืช ืืืืฉ, ืืืขืจืืช ืืืจืฉืืืช? ืืืื ืื ืืืืชื ืืืื ืืืชื ืขื ืืกืืฃ ืืืขืจืืช ืฉืื ืืืชื ื ืคืจืฆืช ืคืืืช ืืงืืืช.
ืืืืจื ืฉืื ื ืืืชืืืช ืงืื ืืื ืื ืืืื ืืก ืืื ืฉืืืชืจ ืคืืฆ'ืจืื ืืื ืฉืืืชืจ ืืืจ; ืืื ืืื ืืช ืคืืฆ'ืจืื ืืฆืืจื ืืืื ืืืืื ืืื ืฉืืืขืจืืช ืชืฉืจืื. ืื ืืคืฉืจ ืืขืฉืืช ืืช ืื ืืฉืืืืืื ืืขื ืืืกืืก.
1 419
const data = { type: 'PaymentReceived', payload: req.body };
channel.publish('', 'payments-received', Buffer.from(JSON.stringify(data), 'utf8'));
res.sendStatus(201);
} catch (err) {
console.log(err);
res.sendStatus(500);
}
});
ืื ืืืืืื ืืืืืง ืืช ืขืจื ืืืืืจ ืฉื publish ืื ืื ืื ืืื false ืืืืืขื ืขืืืื ื ืฉืืื ืืชืืจ. ืื ืฆืจืื ืืืคื ื Exception ืฉืืืืจ ืฉืืขืจืืฅ ืื ืืืืืืจ ื ืกืืจ.
## ืงืืืช ืืืืขืืช
ืืฆื ืืืงืื ืขืืืื ืืืื ืืืฉืชืืฉ ืืืืืงื RabbitMQ ืฉืขืืืคืช ืืช ื connection ืืืชืืืจืช ืืืืฉ, ืืื ืขื ืืืืืกื: ืืคืขื ืื ืื ื ืฆืจืืืื ืืืคืขืื ืืืืฉ ืืช ืืคืื ืงืฆืื consume ืื ืคืขื ืฉืืชืืืจืื ืืืืฉ ื RabbitMQ ืืื ืืืืืื ืืืืฉ ืืืืืขืืช. ืืฉืืื ืื ืื ื ืืืกืืฃ ืืืืืงื ืฉืื ืืืืข ื ืืกืฃ ืฉืืืืืง ืืขืจื ืฉื ืชืืจืื ืืคืื ืงืฆืืืช ืืืคืื ืืืืืขืืช ืืื ืชืืจ, ืืืคืขืื ืืช consume ืื ืคืขื ืืืจื ืฉืืชืืืจืชื ืืืืฉ. ืืงืื ื ืจืื ืื:
class RabbitMQ {
constructor(url) {
this.url = url;
this.messageHandlers = [];
}
async init() {
while (true) {
try {
this.connection = await amqp.connect(this.url);
this.connection.on('close', () => {
console.log('Connection closed, reconnecting in 1 second');
this.init();
});
break;
} catch (err) {
console.log('Connection failed, retrying in 1 second');
console.log(err);
await sleep(1000);
}
}
const channel = await this.connection.createChannel();
this.messageHandlers.forEach(({ queue, callback }) => {
channel.consume(queue, callback.bind(null, channel));
});
return this.connection;
}
addMessageHandler(queue, callback) {
this.messageHandlers.push({ queue, callback });
}
}
ืืฉืืื ืืืฉืชืืฉ ืื ืื ื ืืืื ืืืคืขืื ืืืชื ืืชืื ืคืื ืงืฆืื ืืืืช:
exports.start = async function start() {
const rabbit = new RabbitMQ(RABBITMQ_URL);
rabbit.addMessageHandler('payments-received', (channel, msg) => {
console.log(`Received message: "${msg.content.toString()}"`);
channel.ack(msg);
});
await rabbit.init();
}
ืืืชืืฆืื ืืื ืงืื ืฉืจืช ืฉืืืืื ืืืืืขืืช ืืื ืคืขื ืฉืืงืื ืืืืขื ืืจื RabbitMQ ืืื ืืืคืืก ืืช ืืชืืื ืฉืื ืืืกื, ืืืืชืจ ืืฉืื - ืื RabbitMQ ืืชื ืชืง ืื ืื ืืืื ืืื ืืช ืื ืืฉืจืช ืืืฉืื ืื ืกืืช ืืืชืืืจ ืืืืฉ ืขื ืฉ Rabbit ืืขืื ืฉืื.
## ื .ื. ืืื ืื ืืืคืื ืืช ืืืื ืืืืืื ื?
ืืืฉื ืืืืคืืช ื ืคืืฆื ืืขืืืื ืขื ืงืื ืืืื ืจืื ืืื "ืฉืืืช ืืืืืื ื" (ืื ื ืืืฉื ืฉืืจืืข ืืืฆืืชื ืืช ืืฉื ืืื, ืื ืื ืชืฉืชืืฉื ืื ืืฉืืืืช ืขื ืื ืฉืื ืืืืืฅ), ืืจืขืืื ืืืืื ืื ืฉืื ื ืืืืื ืจืฅ ืืงืื ืืืื ืจ ืฉืจืฅ ืืชืื ืืืื ืื ืื ืงืื ืืืื ืจืื, ืื ืืฉืืฉ ืืขืื ืื ื ืืืื ืืฉืืืจ ืืช ืืงืื ืืืื ืจ ืฉืื ืืื ืื ืืงืื ืืืื ืจืื ืืืจ ืืคืขืื ืงืื ืืืื ืจ ืืืฉ ืขื ืืงืื. ืืืืฉื ืืืืช ืื ื ืืฉืชืืฉ ืืกืงืจืืคื ืืื wait-for-it ืืขืืื ืืฉืืื ืืืืื ืฉ Rabbit ืืืื ืืืื ืื ื ืืืืข ืฉืืงืื ืืืื ืจ ืฉืื ืืขืื ืฉืื ืจืง ืืฉ Rabbit ืื ืขืืื ืฉืื. ืื ื ืงืืจื ืื ืฉืืืช ืืืืืื ื ืื ืืื ืืืืจืช ืฉืืฉืกืจืืืก ื ืืคื ืื ื ืคืื ืืืชื ืืช ืื ืืกืจืืืกืื ืฉืงืฉืืจืื ืืืื ืืขืื ืืขื ืื ืื ืืงืื ืืืื ืจืื ืฉืื ื ืืจืื ืืช ืืื ืืืืฉ ืืืื ืืกืชืืจ.
ืื ื ืื ืืืื ืืช ืืืืฉื ืืืืช ืืฉืชื ืกืืืืช:
1. ืืืืื ืช ืืฉืืืื ืืกืืืจ ืืืคืชืื ืงืื ืืืื ืจืื ืื ืืืื ืื ืืืืื ื, ืืืืืืื ืืฉืื ืืืืืื.
2. ืืืืื ืช ืืืขืจืืช, ืื ืื ื ืกืืืจ ืืช ืื ืืงืื ืืืื ืจ ืฉื ืืฉืจืช ืขื ืฉ Rabbit ืืืื ืืืื, ืืืื ืื ื ืืคืกืื ื ืชืืืื ืฉืืืืชื ืืืื ืื ืืืคื ืืื ืฉืื ืฆืจืืืื ืืชืืื ื Rabbit, ืืื ืขืืฉืื ืืืืืจื ืฉืืืื ืื ืืืจืืชื ืืช ืืงืื ืืืื ืจ.
ืืืฉืื ืขื ืืืขืืืช ืฉืืงืจื ืืืืคืื ืืื ืืงืื ืขืืืจืื ืื ื ืืืชืื ืกืจืืืกืื ืฉืืืื ืืกืื ืื ืืืชืจ ืืืขืืืช ืืื ืืชืจืื ืืืฆืืืืช ืืืืืืช ืฉื ืืืขืจืืช.1 419
# ืืื ืฉืืืืื ืืืงืืืื ืืืืขืืช ืืชืืจ RabbitMQ ืืชืื ืฉืจืช Node.JS Express
ืืฉืื ื ืืืชื ืงืื ืืื ืคืขื ืื ื ื ืชืงืข ืขื ืฉืืืช ืฉืื ื ืืืฉื ืฉืฆืจืืื ืืืืืช ืืืื ืืจืืจื. ืืฉืืืช ืฉื ืืืื ืืืชื RabbitMQ ืืืคืจื ืืื ืืืืจ ืืืชื ื Express. ืื ื ืืงืื ืฉืืกืืฃ ืขืื ืื ืืฆืืจืืฃ ืืื ืืืืืฆืื ืฉืฉืืื ืืฉืื ืื ืืืืื ืืฉืืชื ืืงืืืืื ืืืจืื ืืืืื.
## ืขื ืื ืืฉืื ืืืกืชืื
ืืฆืืชื ืืืื ืืืจืืืื ืืจืฉืช ืฉืืจืืื ืืื ืืืชืืืจ ืืฉืจืช Express ื RabbitMQ ืืื ืืฃ ืืื ืืื ืื ืืชืืื ืืืืืง, ืืืื ืืงื ืื ืืืกืืช ืืจืื ืืื ืืื ืืช ืืช ืืืื ืืืจืฆืื. ืืื ืื ืงืืืืช ืืืจืืืืืช ืฉืืืคืฉืชื ืืคืืชืจืื:
1. ืคืชืืืช Connection ื RabbitMQ ืืื ืืงืจื. ืื ืื ื ืจืืฆืื ืืขืฉืืช ืืช ืื ืื ืคืขื ืืืช ืืืืฉืื.
2. ืคืชืืืช Channel ืืื ืื ืืืชืจ ืืื ืืงืจื, ื RabbitMQ ืืืฉ ืืืื ืืกืืืจ ืื ื Channel-ืื ืืืืฆืข ืืืืื, ืืคืขืืื ืกืชื ืืฉืืื ืืืจืืื. ื Channel ืืืืฆื ืจืฆืฃ ืชืงืฉืืจืช ืืกืืื ืืืืืฉื ืฉื RabbitMQ ืืื ืฉืื ืืืืขื ืื ืืืงืื ืืืื ืกืืืจ ืืช ื Channel. ืืื ืืฉืื ืืืื ืื ืืืฉืชืืฉ ืืืืชื Channel ืืืื Thread-ืื, ืื ืืืงืจื ืฉื Express ืื ืืฉืชืคืื Connection ืืื ืืื ืืงืฉืืช.
3. ืื ืื publish ืืืืืจ false ืืื ืขืืืื ืฉืื ืืช ืืืืืขื. ืืื ืื publish ืืจืง Exception ืื ืืืื ืืืืื ืขื ืื ืืืื ืื ืื ืืืืจ ืฉื Connection ืกืืืจ.
4. ืืืื ืืฉืื ืืื ืฉืื RabbitMQ ืืืื ืืืืืช ืืืื ืืื ืืื ื ืกืืืืช. ืืฉืื ืงืืจื ืื ืื ื ืฆืจืืืื ืืืืืืจ ืฉืืืื ืืืฉืชืืฉืื ืฉืื ืกืื ืืืฆืข ืคืขืืื ืื ืชืื ืฉืืฉืืจ ืืชืืจ, ืืื ืขืืืื ืืืฉืืืจ ืืช ืืฉืจืช ืืืื ืืืืคืื ืื ืชืืืื ืืืจืื ืืื ืืืื ืื ืกืืช ืืืชืืืจ ืืืืฉ ืืื ืฉื ืืื ืืืืืจ ืืขืืื ืืฉ Rabbit ืืขืื ืืืจื.
ืขื ืืจืืขืช ืื ืงืืืืช ืืื ืืขืื ืืื ืืคืฉืจ ืืืืฉืื ืืืชืื ืืช ืืงืื.
## ืงืื ืฉืืืคื ืืืืืืจ ื Rabbit
ืกืคืจืืืช amqplib ืฉื Node.JS ืื ืืืคืืช ืืืืืืจ ืืืืฉ ืืืจื ื ืืชืืง ืื ืื ืื ื ืฆืจืืืื ืืกืืืจ ืืฉืืืื ืืช ืืคืื ื. ืืคืฉืจ ืืื ืืช ืืืืงื ืฉืขืืืคืช Connection ืฉืชืืื ืืื ืืฆืืจื, ืื ืฉื Connection ืืืฉืืจ ืืชืืจ ืฉืื ืืืืข ืืืืืงื ืืื ืคืขื ืฉืืื ืืืกืืจ ืืืืืืืืช ื ื ืกื ืืืชืืืจ ืืืืฉ. ืื ื ืืงืื:
class RabbitMQ {
constructor(url) {
this.url = url;
}
async init() {
while (true) {
try {
this.connection = await amqp.connect(this.url);
this.connection.on('close', () => {
console.log('Connection closed, reconnecting in 1 second');
this.init();
});
break;
} catch (err) {
console.log('Connection failed, retrying in 1 second');
await sleep(1000);
}
}
return this.connection;
}
}
function sleep(ms) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, ms);
});
}
ืืืฆื ืฉืฉืจืช RabbitMQ ืืื ืืช ืื ืืืื ืืืืืงื ื connection ืืืกืืจ ืืื ืื ืืคืขืืืืช ืฉื ื ืกื ืืขืฉืืช ืขืืื ืืืืฉืื. ืืื, ืืืืืช ื Event Handler ืฉืืชืงื ืชื ืืฆืืจื ืืืืืืืืช ื ื ืกื ืืืชืืืจ ืืืืฉ ืืืืจื ืฉืืืื ืฉืื ืืืืืจ ื ืืฉืื ืืขืืื ืขื ื Connection ืืืืฉ.
## ืงืื ืฉืจืช ืฉืฉืืื ืืืืขืืช
ืื ืืื ืขืืืืื ืขื ืืืืืงื RabbitMQ ืืชื ืฉืืืืื? ืืืฉืืง ืืื ืคืฉืื - ืืขืืื ืฉื ืืฉืจืช ืื ื ืจืืฆื ืืืคืขืื ืืช init ืืืืืืช ืฉืืฆืืื, ืืืืจื ืื ืืื ืืงืฉื ื ืื ืกืช ืื ืกื ืืคืชืื Channel ืขืืืจ ืืืชื ืืงืฉื. ืื ืื ืืกืืื ืืฆืืื ืืคืฉืจ ืืืื ืืืืฉืื ืืืคื ืืืงืฉื ืืื ืืื ื ืืฉื (ืืืฉื ืื Rabbit ืืื ืืช ืื ืืืื) ืื ื ืืืืจ ืฉืืืื.
ืืช ืืคืขืืื ืืืืช ืื ื ืขืืฉื ื Middleware ืฉืืืคืขื ืขืืืจ ืื ืืืงืฉืืช ืฉืฆืจืืืืช ืืช RabbitMQ. ื Middleware ืืืืชืืื ืืฉืจืช ื ืจืืื ืื:
const rabbit = new RabbitMQ(RABBITMQ_URL);
async function setup(app) {
await rabbit.init();
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
console.log('setup');
app.use(async function(req, _res, next) {
try {
// Fetches the active connection or re-connect
const connection = rabbit.connection;
const channel = await connection.createChannel();
req.locals = req.locals || {};
req.locals.channel = channel;
return next();
} catch (err) {
console.log(err);
return next(err);
}
});
app.use('/', indexRouter);
}
setup(app);
ืฆืจืื ืืืืื - ืืืืืืช ืืงืื ืืื ื Middleware ืคืืขื ืขื ืื ืื ืชืืืื, ืืื ืืืื ืฉืื Middleware ืืืื ืงื ืืืืกืืฃ ืืืืื ืฉืืคืขื ืจืง ืขื ื ืชืืืื ืืกืืืืื ืื ืขื Router ืืกืืื.
ืืชืื ืงืื ืืืืคืื ืื ืชืื ืื ื ืืืื ืืืฉืื ืืช ื Channel ืืืคืจืกื ืืืื ืืืืขืืช ืืืืคื ืืื:
router.all('/ipn', function(req, res) {
try {
const { channel } = req.locals;1 419
# ืฉืืืฉื ืืืจืื ืฉืืืืชื ืืงืืืจื ืืก (ืืืื ืฉืืืฉ ืื)
ืืชืืืืจืื, ืชืจืืื ืคืจืืืงื ื Docker Compose ื Kubernetes ืืื ืืืืจ ืืื ืงื ืืขืืื: ืืคืขืืืื ืกืงืจืืคื ืืื ืฉืืชืจืื ืืช ืงืืฆื ื docker-compose.yml ืืงืืฆื ืืืืืจืืช ืฉื k8s, ืืขืืื ืืช ืืชืืฆืื ืืงืืืกืืจ ืงืืื ืื ืื ืื ืืืืืื. ืืืฆืืืืช ืืงืื ืื ืงืฆืช ืืืชืจ ืขืืืื ืืืจืฉื ืืกืคืจ ืฉืื ืืืื ืืงืื ืืืขืจืืช - ืืื ืืฆื ืืืืืื ืกืืืืชื ืขื ืงืื ืืื ืืืชืจ ืืื ืฉืืื ืืืชืืื ืืื ืืื ื ืืืื ืืืชืจ ืฉื ืืืจืืืืงืืืจื. ืืืชืืืื ืื ืืืืชื ืืืื ืืกืคืจ ืืืจืื ืืงืืืจื ืืก, ืืื ื ืืฉืืืฉื ืืืจืืืืื:
## ื Dashboard
ื Kubernetes ืืฉ ืืื ืืงืจื ืืืื ื ืฉืืืคืฉืจ ืืืื ืืืช ืืจืืืช ืืช ืื ืืืืื ืืช, ืืช ืื ืืชืืื ืืืช ืฉืจืฆืืช ืขื ืื ืืืื ื ืืื ืืช ืืืืืื, ืืืืืจื ืืจืฉืช ืืืคืืื ืืกืคืง ืืคืฉืจืืช ืืืชืืืจ ืืืงืื Shell ืขื ืื ืืืื ื. ืืืจืืช ืฉืื ื ืืืื ืืืื ืืช ืืขืืืื ืืฉืืจืช ืืคืงืืื, ืืืืืชื ืฉืืื ืืงืจื ืฉืื ืื ืืื ืืืื ืืืจืืืช ืืขืืืช ืฉืืฉืืจืช ืืคืงืืื ืืืื ืงืฉื ืืืฆืื, ืืฉืืฉ ืืฉืื ืืขืืื ืืชืืื ื ืฉื ืืขืืืืืื ืืืจืืงืื.
ืืื ืืืงืจื ืฉื k8s ืืชืขืืื ืืืื ืืืช ืขื ืื ืฉืื ืื ืืงืืืกืืจ, ืืืฉ ืืฉืื ืงืกืื ืืืืืืืง Terminal ืขื ืืฆื ืืกื ืืืืื ืืคืืคื ืฉืืจืื ืืช ืืื ืืืงืจื ืขื ืืืฆื ืืฉื ื ืืืจืืืช ืืื ืคืงืืืืช kubectl ืฉืื ื ืืคืขืื ืืืกืืฃ ืืขืืื ืืช ืืืื ืืืช ืืช ืืชืฆืืื ืืืคืืคื.
## ืืชืืขืื
ืืื ืื ืื Tutorials ืืืืื ืขื ืงืืืจื ืืก ืืื ืืชืืขืื ืขืฆืื ืืขืืื ืืื ืขืื ืืชื ืืืื ืื ืืืฉืงืืข ืืช ืืืื ืืงืจืืื ืฉืื (ืื ืืจืื ืื k8s ืขืฆืื ืกืืคืจ ืืืจืื), ืื ืืกืืฃ ืชืืฆืื ืืช ืื ืื ืฉืืชื ืฆืจืืืื ืืืจืื ืืืชืจ.
ืื ืืชื ืืชืืืืื ืืขืืื ืขื ืงืืืจื ืืก ืชืขืฉื ืืขืฆืืื ืืืื ืืงืื ืืื ืืืื ืจืง ืืงืจืื ืืช ืืชืืขืื ืืงืฆื ืืงืฆื ืืืืืืื ืืืืื ืืช ืืืืฉืืื. ืื ืืืกืื ืืื ืฉืขืืช ืฉื ืืืคืืฉ ืคืืชืจืื ืืช ืืืื ืืจื ื ืืฉืืืืช ืื ืืืืื ืืืช. ืฉืืื ืืืชืืื ืืื:
https://kubernetes.io/docs/concepts/.
## ืขืืืื ืื ืืืื ืืืืืขืืช ืฉืืืื
ืืืจื ืืืชืจ ืืื ืฉืขืืช ืขื docker compose ืื ื ืืืจ ืื ืืืืจ ืืช ืื ืืฉืืืืืช ืฉืื: ืื ื ืืืืข ืืชื ืืื ืจืง ืขืืฉื ืืืืื ืืื ืืื ื ืืืื' ืืื ืืขืฆื ืืืงื ืืืืข ืืฉื ืืื ืจืืืื ืื ืื Cache ืืืื ืืื ืืชืืืื ืืฉืืื ืืืชื ืื ืืืืขืืช ืฉืืืื ืงืจืืคืืืืช.
ืืจืขื ื ืื ืืื ืืื ืืจืืืช ืืช ืงืืืจื ืืก ืฉืืืงื ืืืฉื ืืคืืื - ืฉื ืื ืื ืืชืืชื ืืฉืื ืืื ืืื ืืฆืขืง, ืืืคืืืช ืืืืฉืืงืื ืขื ืขืืฉืื ืืื ืื ืชืืื ืืืื ืืจืืจ ืื ืืืืจืช ืืฉืืืื ืืืื ืืชืงื. ืืื ืฉืืืืช ืืืืื ืืื ืืขืืืื ืืื ืืืืืื ืืฉืื ืืืื ืื ืฉืื ื ืืืื ืคืฉืื ืืืคืขืื
kubectl apply -f . ืืืจื ืฉืื ื ืืขืืื ืงืื ืคืืืืจืฆืืืช ืืืงืืืกืืจ ืคืฉืื ืืืข ืื ืืขืฉืืช.
## ืืืื ืฉืืืฉ ืื
ืื ืื ืืฉ ืื ืืืืื? ืืืืกืืจืงืฆืืืช ืืืืืืืืช ืืืืื. ืืื ืขืฉืจืืช ืฉืืจืืช ืฉื ืงืืืฅ docker-compose.yml ืืคืื ืืื ืืฉืื ืื ืืืืขื ืืืฃ ืฉืืจืืช ืฉื ืงืืฆื ืืืืจืืช ืฉื ืงืืืจื ืืก. ืืืง ืืื ืงืืจื ืื ืงืืืจื ืืก ื ืืชื ืื ืืืชืจ ืฉืืืื ืขื ืืงืืืกืืจ ืืืืืื ืืช, ืืื ืืจืื ืื ืคืฉืื ืื ืื ืืืืจื ืฉื ืงืืฆื ืืืืืจืืช ืืืชืขืงืฉืืช ืขื ืฉืืืืืช. ืื ื ืืืืื ืงืื ื ืืืืช ืืืืืจืืช:
backend:
service:
name: test
port:
number: 80
ืื ื ืืืื ืฉืืืชื ืืื ืกืืื ืืืื ืืืืกืืฃ ืืช ืืืคืชื number ืืชืื port, ืืื ืืืื ืืืืจ ืฉืืคืืื ืื ืืืจ ืฉืืื ืืืชื.
(ืื ืืืืืจืช ืืืืกืืจืงืฆืืืช - ืืงืื ืกืคื ืฉื Ingress Controller ืฉืืืืจ ืฉืื ื ืฆืจืื ืืืชืื ืืืืจืืช NGINX ื DSL ืฉืืื ืฉืืืคื ืืงืืืฅ ืืืืจืืช ืฉื nginx, ืจืง ืืฉืืื ืฉืืคืฉืจ ืืืื ืืืฉืชืืฉ ืืขืชืื ืืืื ืืืจ ืืืงืื nginx ืืื ืื ืืืืื ื, ืื ืืกืืฃ ืื ืืชืื ื DSL ืืืืืจืืช ืื ืืืื ืกืคืฆืืคืืืช ื nginx).
ืื ืืชื ืจืืฆืื ืืืืื ืงืฆืช ืขื ืงืืืจื ืืก ืืื ืืืืืื ืืืคื ืืืชืืื ืื ื ืืืืืฅ ืืืชืงืื minikube ืืฆืืื ืขื ืืืืื ื ืืคื ืืืืจืื ืืื:
https://kubernetes.io/docs/tutorials/hello-minikube/
ืืืืจื ืื ืืืฉืชืืฉ ื kompose ืืื ืืืคืื ืคืจืืืงื Docker Compose ืืคืจืืืงื k8s ืืื ืกืืช ืืืขืืืช ืืช ืืคืจืืืงื ืขื ืืงืืืกืืจ ืฉืืฆืจืชื. ืืืจื ืฉืืื ืืืฉืงืืข ืืื ืืืื ืืงืจืืืช ืืชืืขืื.1 419
# ืืืคืื ืืฉืืืืช ืืืืจื ืืืืืช ืืืชืจ
ืฉืืืช ืืืืจื ืืื ืืฉืืื ืืืืจืื ื ืืืกืืื ืช ืืคื ื ืฉืืงืื ืกืืืจ ืืชื ืขืืกืงื. ืืื ืืจืืข ืฉืื ืืืงืื ืืืืื "ืืืงื" ืื "ืื ืืืงื", ืืฉืืืืช ืืืืจื ืื ืืืืืจืื ืฉืคืจืืืื ืกืจืื ืืื ื ืืืฆืื ืืื. ืืื ืฉืืืืช ืืืืจื ืื ืฆืจืืืืช ืืืืืช ืืืืืฆืืช, ืืคืืืช ืื ืื ืืชืืืกืื ืืืืื ืืฆืืจื ื ืืื ื ืืืืื ืื ืืช ืืจืฆืฃ ืฉืืื ืืชืื ืชืืืื ืืืืืจื. ืฉืืืืช ืืืืืจื ืืืืืืช ืฉืืฉืชืชืคืชื ืืื ืืื ื ืขืืืืช ืืฉื ื ืืฆืืืื - ืืืืขืฉื ืืืืืื ืืืงืื, ืฉืงืืื ืืืืข ืืืขืื ืืฉืื ืืืชืงืื (ืืืื ืืืงืจืื ืฉืื ื ืืืืชื ืืืงืื). ืื ื ืืื ืืืคืื ืฉืืขืืจื ืื ื ืืืืืจ ืืืงื ืืช ืืื ืืืชืจ:
1. ืฉืืืช ืืืืจื ืืชืืืื ืืฉืืงืื ืืืืข ืืืืื ืขื ืืขืื ืืืืคืฉ ืืืื ืคืืชืจืื. ืื ืื ืคืืจืกืืืช ืืคืืืกืืืง ืฉืืงืื ืืืงืจื ืืืฅ ื-ืืืค ืืชื ืืฉืืื, ืื ืกืืืืืฆืื ืืจืื ืืืชืจ ืืืืงืืช. ืืื ืืืืจ ืืจืืฉืื ืฉืื ืื ื ืฆืจืืืื ืืขืฉืืช ืื ืืืืื ืื ืืืขืื ืฉื ืืืงืื.
2. ืื ืืื ืชื ืืช ืืืขืื ืื ื ืืืื ืืืืืื ืืื ืื ื ืจืืฆื/ืืืื ืืคืชืืจ ืืืชื. ืื ืืงืื ืืืืข ืืืื ืืื ืฉืื ื ืืคืชืืจ ืื ืืขืืืช ืืืฆืืขืื ื React ืื ืืกืืจ ืืืืืื ืฉืื ื ืจืืฆื ืืคืชืืจ ืื ืืช ืืืขืื ืื ืื ืจืืฆื. ืื ืื ื ืื ืจืืฆื ืื ืื ืืืื ืืคืชืืจ ืื ืืช ืืืขืื ืจืฆืื ืืกืืื ืื ืืืืก ืืช ืืฉืืื. ืฉืื ืืืจ ืืืื ืคืืชืจืื ืืืขืื ืฉื ืืืงืื ืื ืืขื ืืื ืืจืืข.
3. ืื ืืื ืชื ืืช ืืืขืื ืืื ื ืจืืฆื ืืคืชืืจ ืืืชื ืื ื ืืืื ืืืชืงืื ืืืืืจ ืขื ืืคืืชืจืื, ืืคื ืืจืืข ืฉืื ืื ื ืืชืืืืื ืืืื ืืช ืืืฉืืื. ืื ืืงืื ืืืืข ืืืื ืขื ืืขืืืช ืืืฆืืขืื ืืจืืืงื ืืื ื ืจืืฆื ืืขืืืจ ืื ืืคืืชืจืื ืื ื ืืืืืง ืืืชื ืื ืืื ื ืืกื ืืื ืชืืื, ืืืืื ืขืื ืกืคืจืืืช ืืื ืืฉืชืืฉ, ืืชื ืื ืืืคืื ืื ืื ื ืืืืชื ืขืืฉื ืืืฆื ืืื ืืืชืืจ ืืืงืื ืืคืช ืืจืืื ืืืืืงืช ืฉื ืืื ืืืขืื ืฉืื ืืืืืช ืืืืคืชืจ. ืืื ืฉืชืชื ื ืคื ืืืชืจ ืืืืข ืืชืขื ื ืขื ืืืชืจ ืฉืืืืช ืืื ืฉื ื ืืฆืืืื ืืจืืืืื: ืืชื ืืืืืืื ืืช ืืกืืืืืื ืฉืืืงืื ืืงื ื ืืื ืืกืืฃ, ืืืืงืื ืืจืืืื ืืืืข ืืงืจ ืขืจื ืืืืืกืก ืขื ืื ืืกืืื ืืืืืข ืืืืืืืืื ืฉืืื.
4. ืืคืขืืื ืืืจื ืฉืืขืืจืชื ืืืงืื ืืช ืื ืืคืช ืืืจืืื ืืคืืชืจืื ืืืชื ืืงืื ืขืืืื ืื ืืืื ืืกืคืืง ืืืื ืฉืื ื ืืกืืื ืืคืชืืจ ืื ืืช ืืืขืื. ืืืฆื ืืื ืืืื ืืืืกืืฃ 2-3 ืกืืคืืจื ืืงืจื ืขื ืืขืืืช ืืืืืช ืฉืคืชืจืชื ืืืืฆืืข ืืืงืื ืืืืจ ืขื ืืื ืฉืื ืืจืืืื ืืืื ืืืชื ืขืืืชื. ืืกืืคืืจ ืขื ืืขืืืช ืืืืฆืืขืื ืืจืืืงื ืืืงืืื, ืืืจื ืฉืื ื ืืชืืจ ืืืงืื ืจืฉืืื ืฉื ืืืื ืืืื ืืงืืช ืฉืื ื ืืืืชื ืืฉืชืืฉ ืืื ืืื ืืืืืช ืืืคืชืืจ ืืช ืืืขืื ืื ื ืืืื ืืืฆืืข ืื ืืืืจ ืขื ืจืืฉื ืฆืืืชืื ืื ืื ืืื ืงืืืฆืืช ืืืืจืืช ืืืจืืช ืฉืขืืืชื ืืืชื ืืืื ืคืชืจืชื ืืขืืืช ืืืฆืืขืื ืืืืืช.
ืืกืื ืืฉืืืช ืืืืจื ืืืื ืืื ืืกื ืืื ืืืงืื: ืืืืจ ืขื ืืืขืื, ืืชืืจ ืืืงืื ืืื ืืจืื ืืคืืชืจืื ืืืืฆืืข ืืืงืื ืืจื ืืืืื ืืืชืจ ืขื ืืืืืืช ืฉืืื ืืกืคืง ืืช ืืืชื ืคืืชืจืื. ืื ืื ืืืื ืืืฉืชืืฉ?
1. ืื ืืชื ืื ืืืืื ื ืืื ืืช ืืืขืื ืฉื ืืืงืื, ืืชื ืืืืืื ืืชืืจ ืื ืคืืชืจืื ืืืขืื ืฉืื ืืขื ืืื ืช ืืืชื ืืืฉืืื ืชืืื ืืืื ืื-ืฆืืืืช.
2. ืื ืืคืช ืืืจืืื ืฉืืชื ืืชืืจืื ืืคืืชืจืื ืื ื ืจืืืช ืืืงืื ืืืืื ืืช ืื ืืื ืืชืงืืฃ ืืชืื ืืฉืืืืช ืืืฉืืื ืชืืื ืืืื ืื ื ืขืืื. ืืฆื ืืื ื ืืืข ืืืชื ืืฉืืช ืืื ืืืจื ืฉืืชื ืจืืืืื ืืคืชืืจ ืืขืืืช ืืืื ืืื ืฉืืืงืื ืจืืฆื ืืคืชืืจ ืืช ืืืขืื, ืืื ื ืืืฆื ืืื ืืกืืื ืืช ืืฉืืื ืืืืื ืืืงืืืืช ืฉืืืชืจ ืืชืืืืื ืืชืคืืกืช ืืขืืื ืฉืื.
1 419
# ืืื ืืืืืง ืคืขืืืืช ืืงืฉืืจืืช ืืืื ืขื Jest ื JavaScript
ืกื ืืืืงืืช ืืื ืืืื ืืืกืื ืื ื ืืจืื ืืื ืืชืืืืงื ืืคืืชืื ืฉื ืืืขืจืืช, ืื ืื ืคืขื ืฉืื ืื ื ืืืืขืื ืืืืกืืฃ ืคืืฆ'ืจ ืืืฉ ืื ืื ื ืืืืืื ืืงืื ืืืืขื ืืืืืืช ืืฉืงืื ืืืฉ ืฉืืืจ ืคืืฆ'ืจืื ืืฉื ืื ืฉืื ืื ื, ืืื ืืชืงื ืชืื ืืื ืชื ืืขื. ืืฉืืื ืคืืืืง ืืจืื ืืืืช ืกื ืืืืืงืืช ืฆืจืื ืืืืืช ืืืืจ ืืืกืืื ื ืืืฉืืืื, ืื ืฉืืืื ืืืจืืฅ ืืืชื ืขื ืืืืฉื ืฉืื ืชืื ืืื ืคืืชืื ืืคืืื ืื ืคืขื ืฉืื ื ืืืืฅ Save ื IDE, ืืืงืื ืชืฉืืื ืืืืจื ืื ื ืฉืืจ.
ืกืื ืืื ืฉื ืคืขืืืืช ืฉืขืืื ืืงืืช ืืืชืจ ืืื ืืืืืงืืช ืืื ืืืืงืืช ืฉืขืื ืื: ืื ืืฉ ืคืขืืื ืฉืฆืจืืื ืืงืจืืช "ืืขืื 30 ืฉื ืืืช", ืืืฉื ืื ืืชืืืชื ืคืขืืืช ืชืงืฉืืจืช ืืืขืื 30 ืฉื ืืืช ืืื ืฆืจืืื ืืืชืืื ืืืื Timeout, ืื ืื ืืืืชื ืจืืฆื ืฉืืืืืงื ืชืฆืืจื ืืืืืช 30 ืฉื ืืืช ืขื ืืงืืืช ืืชืฉืืื. ืื ืืื ืฉืืืืฉื ืื ืขืืฉื ืื ืืืื ืืื ืื ื ืืืชื ืขืฉืจืืช ืื ืืืืช ืืืืงืืช ืื ืืืกืคืจืื ืืืื ืืฆืืืจืื.
ื Jest ืืฉ ืื ืื ืื ืืืื ืฉืขืืืจ ืื ื ืืืืืง ืคืขืืืืช ืืงืฉืืจืืช ืืืื ืฉื ืงืจื Fake Timers. ืื ืขืืื ืืื - ื ื ืื ืฉืืฉ ืืื ืืช ืืงืื ืืื ืืืืืืฉ ืฉื ืืฉืืง ืืืืจืื:
import _ from 'lodash';
export default class MemoryGame {
constructor(size) {
this.cards = _.shuffle(_.range(size).flatMap(i => [i, i]).map(i => ({ value: i, visible: false })));
this.foundPairIndexes = new Set();
this.activeCardIndex = -1;
this.hideTimer = null;
}
play = (index) => {
const card = this.cards[index];
if (card.visible) {
return;
}
card.visible = true;
clearTimeout(this.hideTimer);
this.hideTimer = null;
if (this.activeCardIndex >= 0) {
if (this.cards[this.activeCardIndex].value === card.value) {
// Found a match
this.foundPairIndexes.add(this.activeCardIndex);
this.foundPairIndexes.add(index);
this.activeCard = null;
} else {
this.hideTimer = setTimeout(this.hideAllCards.bind(this), 2000);
}
}
this.activeCardIndex = index;
}
isVisible(index) {
if (this.foundPairIndexes.has(index)) {
return true;
}
return this.cards[index].visible;
}
hideAllCards() {
this.cards.forEach(c => { c.visible = false; });
}
}
ืืืฉืืง ืืืจืื N ืงืืคืื ืืคื ืืืืื ืฉืืืงืฉืชื ืืืขืจืื ืืืชื, ืืืคืื ืงืฆืื play ืืืคืืช ืืืืืืงื ืฉื ืืืฉืืง. ืื ืืื ืงืืคืื ืืืืืื ืขื ืืฉืืืื ืืื ืืืคืืช ืงืืฃ ืืื ืืฉ ืืืจ ืงืืฃ ืืืื ืื ืืื ืืืืงืช ืื ืืงืืฃ ืฉืืคืื ื ืขืืฉืื ืืื ืืื ืฉืืืจ ืืืคืืข, ืื ืื ืืฆืืื ืืช ืฉื ืืื ืืื ืื ืื ืืืืืงื Timer ืืื ืืืคืื ืืช ืฉื ื ืืงืืคืื ืืืจื ืืขืื ืฉืชื ืฉื ืืืช.
ืืื - ืืืฉืืง ืืฉ ืืืจ ืืื. ื ืกื ืืงืจืื ืืช ืืงืื ืืืจืืืช ืื ืืชื ืืืื ืื ืืื.
ืืืืง ืฉืงืฉื ืืืืืง ืืืฉืืง ืืื ืืฉืขืื, ืืคื jest ืืืื ืืืื ืืขืืืจ ืื ื. ืืคืื ืงืฆืื jest.useFakeTimers() ืืฉืชืืืช ืขื ืืฉืขืื ืื ืืืืคืฉืจืช ืื ื ืืืื ืงืืืื ืืืื ืืืจ ืืืชืจ; ืืคืื ืงืฆืื jest.useRealTimers() ืืืืืจื ืืช ืืืฆื ืืงืืืืชื. ืื ื ืืืื ืืืชืืื ืืช ืืืืง ืืืืืงืืช ืฉืื ื:
afterEach(function() {
jest.useRealTimers();
});
ืขืืฉืื ืื ืฉืืจืฆื ืืืื ืืืฉืชืืฉ ื useFakeTimers ืืื ืฉืื ืื, ืืืื ืืงืจื ืืกืืฃ ืื ืืืืงื ืืืฆื ืืืืืจ ืืืชื ืืืืช ืืจืืืื.
ืืืจื ืฉืืฉ ืื ื Fake Timers ืื ืื ื ืืืืืื ืืืฉืชืืฉ ืืคืื ืงืฆืื advanceTimersByTime ืฉื jest ืืื ืืจืืฅ ืงืืืื ืืืื. ืื ื ืืืืืงื ืฉืืืืืืช ืฉืฉืชื ืฉื ืืืช ืืืจื ืฉืืคืื ื ืฉื ื ืงืืคืื ืื ืชืืืืื ืื ืืชืืคืื ืืืจื:
it('Turns back the cards when pair is not found', () => {
jest.useFakeTimers();
const g = new MemoryGame(5);
const i1 = 0;
const i2 = g.cards.findIndex(c => c.value !== g.cards[0].value);
g.play(i1);
g.play(i2);
expect(g.isVisible(0)).toBeTruthy();
expect(g.isVisible(i2)).toBeTruthy();
jest.advanceTimersByTime(2500);
expect(g.isVisible(0)).toBeFalsy();
expect(g.isVisible(i2)).toBeFalsy();
});
ืขืืฉืื ืืชื - ืืฆืืชื ืืช ืืืื? ืกืคืจื ืื ืืื ืืื ืืชืืืืืช. ืื ืืฆืืชื ืขืืืื? ื ืกื ืืืจืืฅ ืืฆืืื ืืช jest ืขื ืืงืื ืืชืืื ืืช ืืืืืงื ืื ืกื ืืืืืง ืืื ืฉืืืชืจ ืชืจืืืฉืื ืขื ืฉืชืืฆืื ืืืชื.1 419
# ืืชืืืืช
ืืืืื ืืจืืฉืื ื ืฉืืืืชื ืืจืืกืืช ืืืชื mama; ืืืจืื ืืืืชื ืืช motor ืืื businessman. ืืืฉืืขืืช ืฉื ืฉืืืฉืชื ืืื ืืื ืืืืช ืืื ืื ืฉืฆืจืื ืืฉืืื ืืืืื ืืืืื ืืืชื ืืื ืืืืกืืฃ ืืช ืืืืื.
ืืืื ืืฉืคืืช ืื ืืืื ืืืืืื ืืืชืืื ืืื ืืจืื ืคืขืืื ืืืืง ืืื ืงื: ืื ืืื (ืื ืืืืืจ) ืฉืื ืืชื ืงืื ืืขืืื ืืฆืืื ืชืื ืืกืคืจ ืฉืขืืช ืืื ืืช ืชืืื ืืช ืคืฉืืื ืืกืงืจืฅ', ืืื ืืชื ืืืจ ืืืืขืื ืืชืื ืช ืื ืื ื ืืืื ืฉืชืฆืืืื ืืืชืื ืืช ืืชืืื ืืช ืืจืืฉืื ื ื"ืื-ืืฉื ื-ืืืื-ืฉืคื" ืชืื ืืกืคืจ ืฉืขืืช. ืขื ืืชืจืื ืืื replit.com ืืืืื ืืื ืืืงืจ ืืคืืื ืืชืืง ืฉื ืืืชืงื ืืช ืื ืืืืืจืื ื.
ืืืคืืื ืฉืื ืื ื ืืืืขืื ืืช ืื ืื ืื ืื ื ืขืืืื ื ืชืงืขืื ืืคื ื ืฉืืชืืืืื ืืืื ืื ืืื ื ืคืืืื - ืืืื ืฉืืืื ืฆืจืื ืืืขืช ืืืชืจ ืืคื ื ืฉืืคืฉืจ ืืืื ืืงืืช ืืช ืืฆืขื ืืจืืฉืื (ืืื ืืืืืื ืืงืจืื 5 ืกืคืจืื ืขื ืงืืืจื ืืก ืืืงืื ืคืฉืื ืืืจืื ืืขืจืืช ืงืื ื), ืืืื ืฉืืืื ืื ืื ื ืืงื ืืช ืืฆืขื ืื ื ืืฆืืจื ืืืืฅ ืืช ืืืื ืืืืืื ืืืืฉื ืืืืคืืืื ืืืื ืืื ืื ืืกืื ืืืชื ืืขืชืื (ืื ืืื ืื ื ืืกืชืื ืขืืื), ืืืื ืฉืืืื ืืืื ืฉืืืืงืก ืืื ืื ืืื ืืจืืข ืืื ืื ืื ื ืืกืคืจ ืืื ืืืืจืื ืืืงืืืฆื ืฉื ื-ืืื.
ืืืื ื ืคืจืื. ืืคืื ืฉื, ืืื ืื ืืื ืืฉืื ืืงืื. ืืืืื ืื ืืืืืืช ืืงืืช ืฆืขื ืจืืฉืื ืืืื ืืืืืื ืืืชื ืืชื ืจืืฆืื ืืืืื. ืืืืืจื ืืคืื ืืฉืืืจื ืืืชื ื ืืืืชื ืืงืื; ืืืืืจื ืืงืืช ืืช ืืฆืขื ืืจืืฉืื ืคืืชืืช ืืช ืืืืช ืืืืืจ ืฉืคื ืืืฉื ืืฉืืืืช ืืช ืืคืื ืืฉืืืจ ืฉืื ื ืชืงืจื ืืืื ืืืืืื ืืืจืช.
1 419
# ืืืค ืืืฉ: ืืฉืชืืฉื ื null glob ืืฉืฆืจืื
ืืช ืืืืืื ืืงืฆืจื ืืืืช ืืชืืชื ืืกืงืจืืคื ืืื ืืืฉืื ืืืชืจ ืืื:
#!/bin/bash -e
for json_file in /data/*
do
echo "Importing JSON file $json_file"
python import_json.py "$json_file"
echo "-- Done"
done
ืืืื ืืื ืืืฉืื? ืื ืื ืืกืงืจืืคื import_json.py ืื ืกื ืืคืชืื ืืช ืืงืืืฅ ืฉืืื ืืงืื ืืงืจืืื, ืืืชืืงืื ืจืืงื, ืื ืื ื ื ืงืื ืืช ืืฉืืืื:
FileNotFoundError: [Errno 2] No such file or directory: '/data/*'
ืืกืืื ืืฉืืืื ืืืืืจื ืืื ืฉ bash ืืคืขื ื ืืช ืืืืืื /data/* ืืืืืช ืืืงืกื ืืคืฉืื /data/* ืืื ืจืฉืืืช ืฉืืืช ืืงืืฆืื ืืชืืงืื ืฉื - ืืืื ืฉืืื ืงืืฆืื ืืืืชื ืชืืงืื. ืืคืฉืจ ืืจืืืช ืืช ืื ืืืืืื ืคืฉืืื ืืืชืจ ืืื ืืืืื ืื ืคืืืชืื ืื ืคืฉืื ื ืืชืื ืืช ืฉืชื ืืคืงืืืืช:
# this will print all the files in /etc
$ echo /etc/*
# but this will just print "/data/*"
$ echo /data/*
ืืคืงืืื ืืจืืฉืื ื ืืืืช ืชืืคืืก ืืช ืื ืืงืืฆืื ืืืชืืงืืืช ืืชืื /etc, ืืืฉื ืื ืชืืคืืก ืคืฉืื /data/*. ืืืืื ืฉืืืืจืืืช ืฉืืืืคืกื ืืืคืงืืื ืืฉื ืื ืืื ื ืืืืช ืฉื ืงืืืฅ ืืืื ืื ืืคืฉืจ ืืคืชืื ืืืชื.
ืืืจื ืืื ืงืื ืืฆืืช ืืื ืืื ืืืฉืชืืฉ ื nullglob, ืฉืื ืืืืจ ืฉืื ืืืืืื ืื ืืชืืื ืืืืื ืื ืืืฉ ืืืืืจ ืืืจืืืช ืจืืงื. ื ืกื ืืช ืื:
$ shopt -s nullglob
$ echo /data/*
ืืืคืขื ืื ืืงืืืื ืฉืื ืคืื. ืืชืื ืืืืืื ืื ื ืืงืื ืืืืืง ืืช ืืืชื ืืืืช ืืจืฆืืื:
#!/bin/bash -e
shopt -s nullglob
for json_file in /data/*
do
echo "Importing JSON file $json_file"
python import_json.py "$json_file"
echo "-- Done"
done
ืืคืขื ืืกืงืจืืคื ืื ืื ืกื ืืคืชืื ืงืืืฅ ืขื ืืฉื ืืืืืจ /data* ืืคืฉืื ืื ืืืฆืข ืืฃ ืคืขื ืืช ืืืฃ ืืืืืื ืื ืืืืช ืืื ืงืืฆืื ืฉืืชืืืืื ืืืืืื.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
