Quarkus, AMQ เด“เตบเดฒเตˆเตป เดŽเดจเตเดจเดฟเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Red Hat OpenShift เดชเตเดฒเดพเดฑเตเดฑเตโ€Œเดซเต‹เดฎเดฟเดฒเต† เด•เตเดฒเต—เดกเต-เดจเต‡เดฑเตเดฑเต€เดตเต เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ

เดŽเดฒเตเดฒเดพเดตเตผเด•เตเด•เตเด‚ เดนเดพเดฏเต! เด‡เดคเดพ - เด•เตเดตเดพเตผเด•เตเด•เดธเต เดชเดฐเดฎเตเดชเดฐเดฏเดฟเดฒเต† เดžเด™เตเด™เดณเตเดŸเต† เด…เดตเดธเดพเดจ เดชเต‹เดธเตเดฑเตเดฑเต! (เดตเต‡เดฃเด‚, เดžเด™เตเด™เดณเตเดŸเต† เดตเต†เดฌเดฟเดจเดพเตผ เด•เดพเดฃเตเด• "เด‡เดคเดพเดฃเต เด•เตเดตเดพเตผเด•เตเด•เดธเต - เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เดจเต‡เดฑเตเดฑเต€เดตเต เดœเดพเดต เดซเตเดฐเต†เดฏเดฟเด‚เดตเตผเด•เตเด•เต". เด†เดฆเตเดฏเด‚ เดฎเตเดคเตฝ เดŽเด™เตเด™เดจเต† เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เดชเดฐเดฟเดนเดพเดฐเด™เตเด™เตพ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเดคเต เดŽเด™เตเด™เดจเต†เดฏเต†เดจเตเดจเต เดžเด™เตเด™เตพ เด•เดพเดฃเดฟเดšเตเดšเตเดคเดฐเดพเด‚)

Quarkus, AMQ เด“เตบเดฒเตˆเตป เดŽเดจเตเดจเดฟเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Red Hat OpenShift เดชเตเดฒเดพเดฑเตเดฑเตโ€Œเดซเต‹เดฎเดฟเดฒเต† เด•เตเดฒเต—เดกเต-เดจเต‡เดฑเตเดฑเต€เดตเต เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ

ะ’ เดฎเตเดฎเตเดชเดคเตเดคเต† เดˆ เดชเต‹เดธเตเดฑเตเดฑเดฟเตฝ, เดœเดพเดต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดจเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฑเต† เดซเดฒเดฎเดพเดฏเดฟ เดฒเดญเดฟเดšเตเดš เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเดฒเตเด•เตพ เด•เดฃเด•เตเด•เดพเด•เตเด•เดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดตเตเดจเตเดจ เดชเตเดฐเดธเด•เตเดคเดฎเดพเดฏ เดŸเต‚เดณเตเด•เตพ เดžเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเดšเตเดšเต.

เดชเดคเดฟเดชเตเดชเต 0.17.0 เดฎเตเดคเตฝ, เด•เตเดตเดพเตผเด•เตเด•เดธเต เดตเดฟเดชเตเดฒเดฎเดพเดฏ เดธเดจเตเดฆเต‡เดถ เด•เตเดฏเต‚เดฏเดฟเด‚เด—เต เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด‰เดชเดฏเต‹เด—เดคเตเดคเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต (เดŽเดŽเด‚เด•เตเดฏเตเดชเดฟ), เด‡เดคเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เตเด‚ เด“เตผเด—เดจเตˆเดธเต‡เดทเดจเตเด•เตพเด•เตเด•เตเดฎเดฟเดŸเดฏเดฟเตฝ เดฌเดฟเดธเดฟเดจเดธเตเดธเต เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เด“เดชเตเดชเตบ เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเดพเดฃเต.

Red Hat AMQ เด“เตบเดฒเตˆเตป เด’เดฐเต เด“เดชเตเดชเตบ เดธเต‹เดดเตเดธเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเตเดฑเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดคเตเดคเดฟเตฝ เดจเดฟเตผเดฎเตเดฎเดฟเดšเตเดš เด’เดฐเต เดธเต‡เดตเดจเดฎเดพเดฃเต เดŽเตปเดฎเดพเดธเต† เดชเตเดฒเดพเดฑเตเดฑเตโ€Œเดซเต‹เด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ เดธเด‚เดตเดฟเดงเดพเดจเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต Red Hat OpenShift. เด‡เดคเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพเด•เตเด•เต, เด•เดพเดฃเตเด• เด‡เดตเดฟเดŸเต† (EN). เดฐเดฃเตเดŸเต เดชเตเดคเดฟเดฏ เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดตเดฟเดฆเตเดฏเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เด†เดงเตเดจเดฟเด• OpenShift-เด…เดงเดฟเดทเตโ€Œเด เดฟเดค เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ เดธเด‚เดตเดฟเดงเดพเดจเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต AMQ เด“เตบเดฒเตˆเดจเตเด‚ เด•เตเดตเดพเตผเด•เตเด•เดธเตเด‚ เดŽเด™เตเด™เดจเต† เดธเด‚เดฏเต‹เดœเดฟเดชเตเดชเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เด‡เดจเตเดจเต เดžเด™เตเด™เตพ เดจเดฟเด™เตเด™เดณเต† เด•เดพเดฃเดฟเดšเตเดšเตเดคเดฐเดพเด‚.

OpenShift เดชเตเดฒเดพเดฑเตเดฑเตโ€Œเดซเต‹เดฎเดฟเตฝ เดจเดฟเด™เตเด™เตพ เด‡เดคเดฟเดจเด•เด‚ AMQ เด“เตบเดฒเตˆเตป เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เดจเตเดจเต เด…เดจเตเดฎเดพเดจเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต (เด‡เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด•เดพเดฃเตเด• เด‡เตปเดธเตเดฑเตเดฑเดฒเต‡เดทเตป เด—เตˆเดกเต).

เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดžเด™เตเด™เตพ เด’เดฐเต เด•เตเดตเดพเตผเด•เตเด•เดธเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด‚, เด…เดคเต เดฑเดฟเดฏเดพเด•เตเดŸเต€เดตเต เดฎเต†เดธเต‡เดœเดฟเด‚เด—เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เด“เตผเดกเตผ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด†เดฏเดฟเดฐเดฟเด•เตเด•เตเด‚. เด’เดฐเต เดจเดฟเดถเตเดšเดฟเดค เด‡เดŸเดตเต‡เดณเดฏเดฟเตฝ เดธเดจเตเดฆเต‡เดถ เด•เตเดฏเต‚เดตเดฟเดฒเต‡เด•เตเด•เต เด“เตผเดกเดฑเตเด•เตพ เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจ เด“เตผเดกเตผ เดœเดจเดฑเต‡เดฑเตเดฑเดฑเตเด‚ เด•เตเดฏเต‚เดตเดฟเตฝ เดจเดฟเดจเตเดจเต เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดฌเตเดฐเต—เดธเดฑเดฟเตฝ เด•เดพเดฃเดพเดตเตเดจเตเดจ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเด™เตเด™เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจ เด’เดฐเต เด“เตผเดกเตผ เดชเตเดฐเตŠเดธเดธเดฑเตเด‚ เดˆ เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เด‰เตพเดชเตเดชเต†เดŸเตเด‚.

เด’เดฐเดฟเด•เตเด•เตฝ เดžเด™เตเด™เตพ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดธเตƒเดทเตเดŸเดฟเดšเตเดšเตเด•เดดเดฟเดžเตเดžเดพเตฝ, เดฎเต†เดธเต‡เดœเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเดฒเต‡เด•เตเด•เต เดŽเด™เตเด™เดจเต† เดŽเด‚เดฌเดกเต เดšเต†เดฏเตเดฏเดพเดฎเต†เดจเตเดจเตเด‚ เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดตเดฟเดญเดตเด™เตเด™เตพ เดฒเดญเตเดฏเดฎเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต AMQ เด“เตบเดฒเตˆเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเตเด‚ เดžเด™เตเด™เตพ เดจเดฟเด™เตเด™เดณเต† เด•เดพเดฃเดฟเด•เตเด•เตเด‚.

เด•เตเดตเดพเตผเด•เตเด•เดธเต เด†เดชเตเดชเต

เดžเด™เตเด™เดณเตเดŸเต† เด•เตเดตเดพเตผเด•เตเด•เดธเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด“เดชเตเดชเตบเดทเดฟเดซเตเดฑเตเดฑเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เดชเดฐเดฟเดทเตเด•เดฐเดฟเดšเตเดš เดชเดคเดฟเดชเตเดชเดพเดฃเต amqp-เด•เตเดตเดฟเด•เตเด•เตเดธเตเดฑเตเดฑเดพเตผเดŸเตเดŸเต. เด•เตเดฒเดฏเดจเตเดฑเต เดตเดถเดคเตเดคเดฟเดจเตเดฑเต† เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เด‰เดฆเดพเดนเดฐเดฃเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเดพเด•เตเด‚ เด‡เดตเดฟเดŸเต†.

เด“เตผเดกเตผ เดœเดจเดฑเต‡เดฑเตเดฑเตผ

เด“เดฐเต‹ 5 เดธเต†เด•เตเด•เตปเดกเดฟเดฒเตเด‚ "เด“เตผเดกเดฑเตเด•เตพ" เดŽเดจเตเดจ เดตเดฟเดฒเดพเดธเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดœเดจเดฑเต‡เดฑเตเดฑเตผ เดเด•เดคเดพเดจเดฎเดพเดฏเดฟ เดตเดณเดฐเตเดจเตเดจ เด“เตผเดกเตผ เดเดกเดฟเด•เตพ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต.

@ApplicationScoped
public class OrderGenerator {
 
    private int orderId = 1;
 
    @Outgoing("orders")
    public Flowable<Integer> generate() {
        return Flowable.interval(5, TimeUnit.SECONDS)
        .map(tick -> orderId++);
    }
}

เด“เตผเดกเตผ เดชเตเดฐเต‹เดธเดธเตเดธเตผ

เด“เตผเดกเตผ เดนเดพเตปเดกเตโ€Œเดฒเตผ เด‡เดคเดฟเดฒเตเด‚ เดฒเดณเดฟเดคเดฎเดพเดฃเต, เด‡เดคเต "เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเด™เตเด™เตพ" เดตเดฟเดฒเดพเดธเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃ เดเดกเดฟ เดจเตฝเด•เตเดจเตเดจเต.

@ApplicationScoped
public class OrderProcessor {
    @Incoming("orders")
    @Outgoing("confirmations")
    public Integer process(Integer order) {
        // ะ˜ะดะตะฝั‚ะธั„ะธะบะฐั‚ะพั€ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธั ั€ะฐะฒะตะฝ ัƒะดะฒะพะตะฝะฝะพะผัƒ ะธะดะตะฝั‚ะธั„ะธะบะฐั‚ะพั€ัƒ ะทะฐะบะฐะทะฐ <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
        return order * 2;
    }
}

เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃ เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ

เดžเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดธเตƒเดทเตเดŸเดฟเดšเตเดš เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเด™เตเด™เตพ เดฒเดฟเดธเตเดฑเตเดฑเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต HTTP เดŽเตปเดกเตโ€Œเดชเต‹เดฏเดฟเดจเตเดฑเดพเดฃเต เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃ เด‰เดฑเดตเดฟเดŸเด‚.

@Path("/confirmations")
public class ConfirmationResource {
 
    @Inject
    @Stream("confirmations") Publisher<Integer> orders;
 
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
 
 
    @GET
    @Path("/stream")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    public Publisher<Integer> stream() {
        return orders;
    }
}

เด•เดฎเดชเตเดชเต†เดŸเตเดคเตเดคเดฒเต

AMQ เด“เตบเดฒเตˆเดจเดฟเดฒเต‡เด•เตเด•เต เด•เดฃเด•เตเดฑเตเดฑเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดžเด™เตเด™เดณเตเดŸเต† เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเต เดšเดฟเดฒ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดกเดพเดฑเตเดฑ เด†เดตเดถเตเดฏเดฎเดพเดฃเต, เด…เดคเดพเดฏเดคเต: เด•เตเดตเดพเตผเด•เตเด•เดธเต เด•เดฃเด•เตเดฑเตเดฑเตผ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป, AMQP เดŽเตปเดกเตโ€Œเดชเต‹เดฏเดฟเดจเตเดฑเต เดตเดฟเดตเดฐเด™เตเด™เดณเตเด‚ เด•เตเดฒเดฏเดจเตเดฑเต เด•เตเดฐเต†เดกเตปเดทเตเดฏเดฒเตเด•เดณเตเด‚. เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดŽเดฒเตเดฒเดพ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดกเดพเดฑเตเดฑเดฏเตเด‚ เด’เดฐเดฟเดŸเดคเตเดคเต เดธเต‚เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฃเต เดจเดฒเตเดฒเดคเต, เดŽเดจเตเดจเดพเตฝ เด•เตเดตเดพเตผเด•เตเด•เดธเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดธเดพเดงเตเดฏเดฎเดพเดฏ เด“เดชเตเดทเดจเตเด•เตพ เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดžเด™เตเด™เตพ เด…เดตเดฏเต† เดฎเดจเดƒเดชเต‚เตผเดตเตเดตเด‚ เดตเต‡เตผเดคเดฟเดฐเดฟเด•เตเด•เตเด‚.

เด•เดฃเด•เตเดŸเดฑเตเด•เตพ

เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเตเดฐเต‹เดชเตเดชเตผเดŸเตเดŸเดฟ เดซเดฏเตฝ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เด‚เดชเตˆเตฝ เดธเดฎเดฏเดคเตเดคเต เด•เดฃเด•เตเดฑเตเดฑเตผ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดจเตฝเด•เดพเด‚:

mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp

เด•เดพเดฐเตเดฏเด™เตเด™เตพ เดฒเดณเดฟเดคเดฎเดพเด•เตเด•เดพเตป, "เด“เตผเดกเดฑเตเด•เตพ" เดตเดฟเดฒเดพเดธเดคเตเดคเดฟเดจเดพเดฏเดฟ เดžเด™เตเด™เตพ เด’เดฐเต เดธเดจเตเดฆเต‡เดถ เด•เตเดฏเต‚ เดฎเดพเดคเตเดฐเดฎเต‡ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เต‚. เดžเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเดฒเต† "เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเด™เตเด™เตพ" เดตเดฟเดฒเดพเดธเด‚ เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเดฟเตฝ เด’เดฐเต เด•เตเดฏเต‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚.

AMQP เด…เดตเดธเดพเดจ เดชเต‹เดฏเดฟเดจเตเดฑเต

เด•เด‚เดชเตˆเตฝ เดธเดฎเดฏเดคเตเดคเต, AMQP เดŽเตปเดกเตโ€Œเดชเต‹เดฏเดฟเดจเตเดฑเดฟเดจเดพเดฏเตเดณเตเดณ เดนเต‹เดธเตเดฑเตเดฑเตเดจเดพเดฎเดตเตเด‚ เดชเต‹เตผเดŸเตเดŸเต เดจเดฎเตเดชเดฑเตเด‚ เด…เดœเตเดžเดพเดคเดฎเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เด…เดต เด•เตเดคเตเดคเดฟเดตเดฏเตเด•เตเด•เดฃเด‚. AMQ เด“เตบเดฒเตˆเตป เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดš เด•เต‹เตบเดซเดฟเด—เตโ€Œเดฎเดพเดชเตเดชเดฟเตฝ เดŽเตปเดกเตโ€Œเดชเต‹เดฏเดฟเดจเตเดฑเต เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚, เด…เดคเดฟเดจเดพเตฝ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเดฟเดฒเต† เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดตเดดเดฟ เดžเด™เตเด™เตพ เด…เดตเดฏเต† เดจเดฟเตผเดตเตเดตเดšเดฟเด•เตเด•เตเด‚:

spec:
  template:
    spec:
      containers:
      - env:
        - name: AMQP_HOST
          valueFrom:
            configMapKeyRef:
              name: quarkus-config
              key: service.host
        - name: AMQP_PORT
          valueFrom:
            configMapKeyRef:
              name: quarkus-config
              key: service.port.amqp

เด•เตเดฐเต†เดกเตปเดทเตเดฏเดฒเตเด•เตพ

เด“เดชเตเดชเตบเดทเดฟเดซเตเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดžเด™เตเด™เดณเตเดŸเต† เด…เดชเต‡เด•เตเดท เด†เดงเดฟเด•เดพเดฐเดฟเด•เดฎเดพเด•เตเด•เดพเตป เดธเต‡เดตเดจ เด…เด•เตเด•เต—เดฃเตเดŸเต เดŸเต‹เด•เตเด•เตบ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพ เด†เดฆเตเดฏเด‚ เดชเต‹เดกเดฟเดจเตเดฑเต† เดซเดฏเตฝ เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเตเดฐเดพเดฎเดพเดฃเต€เด•เดฐเดฃ เดŸเต‹เด•เตเด•เตบ เดตเดพเดฏเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดธเต‹เดดเตโ€Œเดธเต เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เดฃเด‚:

public class MessagingCredentialsConfigSource implements ConfigSource {
    private static final Set<String> propertyNames;
 
    static {
        propertyNames = new HashSet<>();
        propertyNames.add("amqp-username");
        propertyNames.add("amqp-password");
    }
 
    @Override
    public Set<String> getPropertyNames() {
        return propertyNames;
    }
 
    @Override
    public Map<String, String> getProperties() {
        try {
            Map<String, String> properties = new HashMap<>();
            properties.put("amqp-username", "@@serviceaccount@@");
            properties.put("amqp-password", readTokenFromFile());
            return properties;
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }
 
    @Override
    public String getValue(String key) {
        if ("amqp-username".equals(key)) {
            return "@@serviceaccount@@";
        }
        if ("amqp-password".equals(key)) {
            try {
                return readTokenFromFile();
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        }
        return null;
    }
 
    @Override
    public String getName() {
        return "messaging-credentials-config";
    }
 
    private static String readTokenFromFile() throws IOException {
        return new String(Files.readAllBytes(Paths.get("/var/run/secrets/kubernetes.io/serviceaccount/token")), StandardCharsets.UTF_8);
    }
}

เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด•

เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด’เดฐเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเดฌเดฟเตพ เดซเดฏเดฒเดฟเดฒเต‡เด•เตเด•เต เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเดฟเดจเดพเตฝ, เด’เดฐเต GraalVM เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เตป เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เด‡เดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดŽเด™เตเด™เดจเต† เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเด‚ เดŽเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เตพเด•เตเด•เต, เด…เดจเตเดฌเดจเตเดง เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เด•เดพเดฃเตเด• เด•เตเดตเดพเตผเด•เตเด•เดธเต เด—เตˆเดกเต.

เดคเตเดŸเตผเดจเตเดจเต, เด…เดตเดฟเดŸเต† เดจเตฝเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เดชเดพเดฒเดฟเดšเตเดšเต, เดจเดฟเด™เตเด™เตพ เด‰เดฑเดตเดฟเดŸเด‚ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดžเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต:

git clone https://github.com/EnMasseProject/enmasse-example-clients
cd enmasse-example-clients/quarkus-example-client
oc new-project myapp
mvn -Pnative -Dfabric8.mode=openshift -Dfabric8.build.strategy=docker package fabric8:build fabric8:resource fabric8:apply

เดˆ เด•เดฎเดพเตปเดกเตเด•เตพเด•เตเด•เต เดถเต‡เดทเด‚, เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด‚, เดŽเดจเตเดจเดพเตฝ AMQ เด“เตบเดฒเตˆเดจเดฟเตฝ เดžเด™เตเด™เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเตเดตเดฐเต† เด†เดฐเด‚เดญเดฟเด•เตเด•เดฟเดฒเตเดฒ.

เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ เดธเด‚เดตเดฟเดงเดพเดจเด‚ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต

เด‡เดชเตเดชเต‹เตพ เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเดคเต เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดžเด™เตเด™เดณเตเดŸเต† เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดธเดœเตเดœเดฎเดพเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต: 1) เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ เดธเดฟเดธเตเดฑเตเดฑเด‚ เดŽเตปเดกเตโ€Œเดชเต‹เดฏเดฟเดจเตเดฑเต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดตเดฟเดฒเดพเดธ เด‡เดŸเด‚; 2) เดžเด™เตเด™เตพ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดตเดฟเดฒเดพเดธเด™เตเด™เตพ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดตเดฟเดฒเดพเดธเด‚; 3) เด•เตเดฒเดฏเดจเตเดฑเต เด•เตเดฐเต†เดกเตปเดทเตเดฏเดฒเตเด•เตพ เดธเดœเตเดœเดฎเดพเด•เตเด•เดพเตป เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ.

เดตเดฟเดฒเดพเดธ เดธเตเดฅเดฒเด‚

AMQ เด“เตบเดฒเตˆเดจเดฟเดฒเต† เด’เดฐเต เด…เดกเตเดฐเดธเตโ€Œเดธเตโ€Œเดชเต‡เดธเต เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดŽเดจเตเดจเดคเต เด•เดฃเด•เตเดทเตป เดŽเตปเดกเตโ€Œเดชเต‹เดฏเดฟเดจเตเดฑเตเด•เดณเตเด‚ เดชเตเดฐเดพเดฎเดพเดฃเต€เด•เดฐเดฃ, เด…เด‚เด—เต€เด•เดพเดฐ เดจเดฏเด™เตเด™เดณเตเด‚ เดชเด™เตเด•เดฟเดŸเตเดจเตเดจ เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดตเดฟเดฒเดพเดธเด™เตเด™เดณเดพเดฃเต. เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดตเดฟเดฒเดพเดธ เด‡เดŸเด‚ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ เดŽเตปเดกเตโ€Œเดชเต‹เดฏเดฟเดจเตเดฑเตเด•เตพ เดŽเด™เตเด™เดจเต† เดคเตเดฑเดจเตเดจเตเด•เดพเดŸเตเดŸเดชเตเดชเต†เดŸเตเดฎเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดพเด‚:

apiVersion: enmasse.io/v1beta1
kind: AddressSpace
metadata:
  name: quarkus-example
spec:
  type: brokered
  plan: brokered-single-broker
  endpoints:
  - name: messaging
    service: messaging
    exports:
    - name: quarkus-config
      kind: configmap

เดตเดฟเดฒเดพเดธเด™เตเด™เตพ

เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เด…เดฏเด•เตเด•เดพเดจเตเด‚ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เดพเดจเตเด‚ เดตเดฟเดฒเดพเดธเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เด“เดฐเต‹ เดตเดฟเดฒเดพเดธเดคเตเดคเดฟเดจเตเด‚ เด’เดฐเต เดคเดฐเด‚ เด‰เดฃเตเดŸเต, เด…เดคเต เด…เดคเดฟเดจเตเดฑเต† เดธเต†เดฎเดพเดจเตเดฑเดฟเด•เตเดธเดฟเดจเต† เดจเดฟเตผเดฃเตเดฃเดฏเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเตเดชเต‹เดฒเต† เดคเดจเตเดจเต† เดฑเดฟเดธเตผเดตเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸ เดตเดฟเดญเดตเด™เตเด™เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดชเตเดฒเดพเดจเตเด‚. เดตเดฟเดฒเดพเดธเด‚ เดจเดฟเตผเดฃเตเดฃเดฏเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด‡เดคเตเดชเต‹เดฒเต†:

apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
  name: quarkus-example.orders
spec:
  address: orders
  type: queue
  plan: brokered-queue

เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต

เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เต เดฎเดพเดคเตเดฐเดฎเต‡ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดตเดฟเดฒเดพเดธเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เด…เดฏเดฏเตโ€Œเด•เตเด•เดพเดจเตเด‚ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเต‚ เดŽเดจเตเดจเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เดพเตป, เดจเดฟเด™เตเด™เตพ เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ เดธเด‚เดตเดฟเดงเดพเดจเดคเตเดคเดฟเตฝ เด’เดฐเต เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต† เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เดฃเด‚. เด’เดฐเต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เดพเดฏเดฟ, เด’เดฐเต เด“เดชเตเดชเตบเดทเดฟเดซเตเดฑเตเดฑเต เดธเต‡เดตเดจ เด…เด•เตเด•เต—เดฃเตเดŸเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เตเดฒเดฏเดจเตเดฑเตเด•เดณเต† เดชเตเดฐเดพเดฎเดพเดฃเต€เด•เดฐเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. "เดธเตผเดตเต€เดธเต เด…เด•เตเด•เต—เดฃเตเดŸเต" เดŽเดจเตเดจ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต† เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดพเด‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด‡เดคเตเดชเต‹เดฒเต†:

apiVersion: user.enmasse.io/v1beta1
kind: MessagingUser
metadata:
  name: quarkus-example.app
spec:
  username: system:serviceaccount:myapp:default
  authentication:
    type: serviceaccount
  authorization:
  - operations: ["send", "recv"]
    addresses: ["orders"]

เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด…เดจเตเดฎเดคเดฟเด•เตพ

AMQP เดŽเตปเดกเตโ€Œเดชเต‹เดฏเดฟเดจเตเดฑเต เดตเดฟเดตเดฐเด™เตเด™เตพ เด‰เตพเดšเตเดšเต‡เตผเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดš เด•เต‹เตบเดซเดฟเด—เตโ€Œเดฎเดพเดชเตเดชเต AMQ เด“เตบเดฒเตˆเดจเดพเดฏเดฟ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดฑเต‹เดณเตเด‚ เดฑเต‹เตพเดฌเตˆเตปเดกเดฟเด‚เด—เตเด‚ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: quarkus-config
spec:
  rules:
  - apiGroups: [ "" ]
    resources: [ "configmaps" ]
    verbs: [ "create" ]
  - apiGroups: [ "" ]
    resources: [ "configmaps" ]
    resourceNames: [ "quarkus-config" ]
    verbs: [ "get", "update", "patch" ]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: quarkus-config
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: quarkus-config
subjects:
- kind: ServiceAccount
  name: address-space-controller
  namespace: amq-online-infra

เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเด•เตพ เดŽเด™เตเด™เดจเต† เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด‡เดคเตเดชเต‹เดฒเต† เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚:

cd enmasse-example-clients/quarkus-example-client
oc project myapp
oc apply -f src/main/resources/k8s/addressspace
oc apply -f src/main/resources/k8s/address

เด…เดชเต‡เด•เตเดท เดชเดฐเดฟเดถเต‹เดงเดฟเดšเตเดšเตเดฑเดชเตเดชเดฟเด•เตเด•เตฝ

เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด†เดฐเด‚เดญเดฟเดšเตเดšเตเดตเต†เดจเตเดจเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เดพเตป, เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เด…เดจเตเดฌเดจเตเดง เดตเดฟเดฒเดพเดธเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต‹ เดŽเดจเตเดจเตเด‚ เดธเดœเต€เดตเดฎเดพเดฃเต‹ เดŽเดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚:

until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done

เด…เดชเตเดชเต‹เตพ เดจเดฎเตเด•เตเด•เต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดฑเต‚เดŸเตเดŸเต URL เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚ (เดฌเตเดฐเต—เดธเดฑเดฟเตฝ เดˆ เดตเดฟเดฒเดพเดธเด‚ เดคเตเดฑเด•เตเด•เตเด•):

echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"

AMQ เด“เตบเดฒเตˆเดจเดฟเตฝ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เด…เดฏเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเดพเตฝ เดŸเดฟเด•เตเด•เดฑเตเดฑเตเด•เตพ เด•เดพเดฒเดพเด•เดพเดฒเด™เตเด™เดณเดฟเตฝ เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเตเดตเต†เดจเตเดจเต เดฌเตเดฐเต—เดธเตผ เด•เดพเดฃเดฟเด•เตเด•เดฃเด‚.

เดธเด‚เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต

เด…เดคเดฟเดจเดพเตฝ เดžเด™เตเด™เตพ เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ AMQP เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด•เตเดตเดพเตผเด•เตเด•เดธเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดŽเดดเตเดคเดฟ, Red Hat OpenShift เดชเตเดฒเดพเดฑเตเดฑเตโ€Œเดซเต‹เดฎเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เตเดฐเดฎเต€เด•เดฐเดฟเดšเตเดšเต, AMQ เด“เตบเดฒเตˆเตป เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ เด…เดคเดฟเดจเตเดฑเต† เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฟ. เดžเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดพเดฏเดฟ เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ เดธเด‚เดตเดฟเดงเดพเดจเด‚ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เดžเด™เตเด™เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดšเต.

เด‡เดคเต เด•เตเดตเดพเตผเด•เตเด•เดธเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดชเดฐเดฎเตเดชเดฐ เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เดชเตเดคเดฟเดฏเดคเตเด‚ เดฐเดธเด•เดฐเดตเตเดฎเดพเดฏ เด’เดฐเตเดชเดพเดŸเต เด•เดพเดฐเตเดฏเด™เตเด™เตพ เดฎเตเดจเตเดจเดฟเดฒเตเดฃเตเดŸเต, เดคเตเดŸเดฐเตเด•!

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•