Apache Ignite Zero Deployment: ื‘ืืžืช ืืคืก?

Apache Ignite Zero Deployment: ื‘ืืžืช ืืคืก?

ืื ื—ื ื• ืžื—ืœืงืช ื”ืคื™ืชื•ื— ื”ื˜ื›ื ื•ืœื•ื’ื™ ืฉืœ ืจืฉืช ืงืžืขื•ื ืื™ืช. ื™ื•ื ืื—ื“, ื”ื”ื ื”ืœื” ืงื‘ืขื” ืืช ื”ืžืฉื™ืžื” ืœื”ืื™ืฅ ื—ื™ืฉื•ื‘ื™ื ื‘ืงื ื” ืžื™ื“ื” ื’ื“ื•ืœ ืขืœ ื™ื“ื™ ืฉื™ืžื•ืฉ ื‘- Apache Ignite ื‘ืฉื™ืœื•ื‘ ืขื MSSQL, ื•ื”ืจืืชื” ืืชืจ ืื™ื ื˜ืจื ื˜ ืขื ืื™ื•ืจื™ื ื™ืคื™ื ื•ื“ื•ื’ืžืื•ืช ืฉืœ ืงื•ื“ Java. ืžื™ื“ ืื”ื‘ืชื™ ืืช ื”ืืชืจ ืืคืก ืคืจื™ืกื”, ืฉื”ืชื™ืื•ืจ ืฉืœื• ืžื‘ื˜ื™ื— ื ื™ืกื™ื: ืืชื” ืœื ืฆืจื™ืš ืœืคืจื•ืก ื™ื“ื ื™ืช ืืช ืงื•ื“ ื”-Java ืื• Scala ืฉืœืš ื‘ื›ืœ ืฆื•ืžืช ื‘ืจืฉืช ื•ืœืคืจื•ืก ืื•ืชื• ืžื—ื“ืฉ ื‘ื›ืœ ืคืขื ืฉื”ื•ื ืžืฉืชื ื”. ื›ื›ืœ ืฉื”ืชืงื“ืžื” ื”ืขื‘ื•ื“ื”, ื”ืชื‘ืจืจ ืฉืœ-Zero Deployment ื™ืฉ ืฉื™ืžื•ืฉื™ื ืกืคืฆื™ืคื™ื™ื, ืฉืืช ื”ืชื›ื•ื ื•ืช ืฉืœื”ื ืื ื™ ืจื•ืฆื” ืœืฉืชืฃ. ืžืชื—ืช ืœื’ื–ืจื” ื™ืฉ ืžื—ืฉื‘ื•ืช ื•ืคืจื˜ื™ ื™ื™ืฉื•ื.

1. ื”ืฆื”ืจืช ื”ื‘ืขื™ื”

ืžื”ื•ืช ื”ื‘ืขื™ื” ื”ื™ื ื›ื“ืœืงืžืŸ. ื™ืฉ ืกืคืจื™ื™ืช ื ืงื•ื“ื•ืช ืžื›ื™ืจื” ืฉืœ SalesPoint ื•ืกืคืจื™ื™ืช ืžื•ืฆืจื™ื ืฉืœ Sku (ื™ื—ื™ื“ืช ืฉืžื™ืจื”). ืœื ืงื•ื“ืช ื”ืžื›ื™ืจื” ื™ืฉ ืชื›ื•ื ื” "ืกื•ื’ ื—ื ื•ืช" ืขื ื”ืขืจื›ื™ื "ืงื˜ืŸ" ื•"ื’ื“ื•ืœ". ืœื›ืœ ื ืงื•ื“ืช ืžื›ื™ืจื” ืžื—ื•ื‘ืจ ืžื‘ื—ืจ (ืจืฉื™ืžืช ืžื•ืฆืจื™ื ืฉืœ ื ืงื•ื“ืช ื”ืžื›ื™ืจื”) (ื ื˜ืขืŸ ืžื”-DBMS) ื•ื ื™ืชืŸ ืžื™ื“ืข ืฉื”ื—ืœ ืžื”ืชืืจื™ืš ืฉืฆื•ื™ืŸ ื”ืžื•ืฆืจ ืฉืฆื•ื™ืŸ
ืœื ื ื›ืœืœ ืžื”ืžื‘ื—ืจ ืื• ื ื•ืกืฃ ืœืžื‘ื—ืจ.

ื ื“ืจืฉ ืœืืจื’ืŸ ืžื˜ืžื•ืŸ ืžื—ื•ืœืง ืฉืœ ื ืงื•ื“ื•ืช ืžื›ื™ืจื” ื•ืœืื—ืกืŸ ื‘ื• ืžื™ื“ืข ืขืœ ืžื•ืฆืจื™ื ืžื—ื•ื‘ืจื™ื ืœืžืฉืš ื—ื•ื“ืฉ ืžืจืืฉ. ืชืื™ืžื•ืช ืขื ืžืขืจื›ืช ื”ืœื—ื™ืžื” ืžื—ื™ื™ื‘ืช ืืช ืฆื•ืžืช ื”ืœืงื•ื— Ignite ืœื˜ืขื•ืŸ ื ืชื•ื ื™ื, ืœื—ืฉื‘ ืื’ืจื’ื˜ ืฉืœ ื”ื˜ื•ืคืก (ืกื•ื’ ื—ื ื•ืช, ืงื•ื“ ืžื•ืฆืจ, ื™ื•ื, ืžืกืคืจ_ื ืงื•ื“ื•ืช_ืžื›ื™ืจื•ืช) ื•ืœื”ืขืœื•ืช ืื•ืชื• ื‘ื—ื–ืจื” ืœ-DBMS.

2. ืœื™ืžื•ื“ ืกืคืจื•ืช

ืขื“ื™ื™ืŸ ืื™ืŸ ืœื™ ื ื™ืกื™ื•ืŸ, ืื– ืื ื™ ืžืชื—ื™ืœ ืœืจืงื•ื“ ืžื”ื›ื™ืจื™ื™ื. ื›ืœื•ืžืจ ืžืกืงื™ืจืช ืคืจืกื•ืžื™ื.

ืกืขื™ืฃ 2016 ื”ื™ื›ืจื•ืช ืขื Apache Ignite: ื”ืฉืœื‘ื™ื ื”ืจืืฉื•ื ื™ื ืžื›ื™ืœ ืงื™ืฉื•ืจ ืœืชื™ืขื•ื“ ืฉืœ ืคืจื•ื™ืงื˜ Apache Ignite ื•ื‘ืื•ืชื• ื”ื–ืžืŸ ืชื•ื›ื—ื” ืขืœ ืขืžื™ืžื•ืช ื”ืชื™ืขื•ื“ ื”ื–ื”. ืงืจืืชื™ ืื•ืชื• ืฉื•ื‘ ื›ืžื” ืคืขืžื™ื, ื”ื‘ื”ื™ืจื•ืช ืœื ื‘ืื”. ืื ื™ ืžืชื™ื™ื—ืก ืœืžื“ืจื™ืš ื”ืจืฉืžื™ ืžืชื—ื™ืœื™ืืืฉืจ
ืžื‘ื˜ื™ื— ื‘ืื•ืคื˜ื™ืžื™ื•ืช "ืืชื” ืชืชื—ื™ืœ ื‘ืžื”ื™ืจื•ืช!" ืื ื™ ืžื’ืœื” ืืช ื”ื’ื“ืจื•ืช ืžืฉืชื ื™ ื”ืกื‘ื™ื‘ื”, ืฆื•ืคื” ื‘ืฉื ื™ ืกืจื˜ื•ื ื™ Apache Ignite Essentials, ืื‘ืœ ื”ื ืœื ื”ื™ื• ืฉื™ืžื•ืฉื™ื™ื ื‘ืžื™ื•ื—ื“ ืขื‘ื•ืจ ื”ืžืฉื™ืžื” ื”ืกืคืฆื™ืคื™ืช ืฉืœื™. ืื ื™ ืžืคืขื™ืœ ื‘ื”ืฆืœื—ื” ืืช Ignite ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ืขื ื”ืงื•ื‘ืฅ ื”ืกื˜ื ื“ืจื˜ื™ "example-ignite.xml", ื•ื‘ื•ื ื” ืืช ื”ื™ื™ืฉื•ื ื”ืจืืฉื•ืŸ ื™ื™ืฉื•ื ืžื—ืฉื•ื‘ ื‘ืืžืฆืขื•ืช Maven. ื”ืืคืœื™ืงืฆื™ื” ืขื•ื‘ื“ืช ื•ืžืฉืชืžืฉืช ื‘- Zero Deployment, ืื™ื–ื” ื™ื•ืคื™!

ืงืจืืชื™ ืขื•ื“, ื•ืฉื ื”ื“ื•ื’ืžื” ืžืฉืชืžืฉืช ืžื™ื“ ื‘-affinityKey (ื ื•ืฆืจื” ืงื•ื“ื ืœื›ืŸ ื‘ืืžืฆืขื•ืช ืฉืื™ืœืชืช SQL), ื•ืืคื™ืœื• ืžืฉืชืžืฉืช ื‘-BinaryObject ื”ืžืกืชื•ืจื™:

IgniteCache<BinaryObject, BinaryObject> people 
        = ignite.cache("Person").withKeepBinary(); 

ืœืงืจื•ื ะฝะตะผะฝะพะณะพ: ืคื•ืจืžื˜ ื‘ื™ื ืืจื™ - ืžืฉื”ื• ื›ืžื• ื”ืฉืชืงืคื•ืช, ื’ื™ืฉื” ืœืฉื“ื•ืช ืฉืœ ืื•ื‘ื™ื™ืงื˜ ืœืคื™ ืฉื. ื™ื›ื•ืœ ืœืงืจื•ื ืืช ื”ืขืจืš ืฉืœ ืฉื“ื” ืžื‘ืœื™ ืœื‘ืฆืข ื“ื”-ืกืจื™ืืœื™ื–ืฆื™ื” ืžื•ื—ืœื˜ืช ืฉืœ ื”ืื•ื‘ื™ื™ืงื˜ (ื—ื™ืกื›ื•ืŸ ื‘ื–ื™ื›ืจื•ืŸ). ืื‘ืœ ืžื“ื•ืข ืžืฉืชืžืฉื™ื ื‘-BinaryObject ื‘ืžืงื•ื ื‘-Person, ืžื›ื™ื•ื•ืŸ ืฉื™ืฉ ืคืจื™ืกื” ืืคืกื™ืช? ืœืžื” IgniteCache ื”ื•ืขื‘ืจ ืœ-IgniteCache ? ื–ื” ืขื“ื™ื™ืŸ ืœื ื‘ืจื•ืจ.

ืื ื™ ืขื•ืจืš ืžื—ื“ืฉ ืืช ืืคืœื™ืงืฆื™ื™ืช Compute ื›ื“ื™ ืœื”ืชืื™ื ืœืžืงืจื” ืฉืœื™. ื”ืžืคืชื— ื”ืจืืฉื™ ืฉืœ ืกืคืจื™ื™ืช ื ืงื•ื“ื•ืช ื”ืžื›ื™ืจื” ื‘-MSSQL ืžื•ื’ื“ืจ ื›-[id] [int] NOT NULL, ืื ื™ ื™ื•ืฆืจ ืžื˜ืžื•ืŸ ื‘ืื ืœื•ื’ื™ื”

IgniteCache<Integer, SalesPoint> salesPointCache=ignite.cache("spCache")

ื‘ืชืฆื•ืจืช xml ืื ื™ ืžืฆื™ื™ืŸ ืฉื”ืžื˜ืžื•ืŸ ืžื—ื•ืœืง ืœืžื—ื™ืฆื•ืช

<bean class="org.apache.ignite.configuration.CacheConfiguration">
    <property name="name" value="spCache"/>
    <property name="cacheMode" value="PARTITIONED"/>
</bean>

ื—ืœื•ืงื” ืœืคื™ ื ืงื•ื“ืช ืžื›ื™ืจื” ืžื ื™ื—ื” ืฉื”ืžืฆื‘ืจ ื”ื ื“ืจืฉ ื™ื™ื‘ื ื” ืขืœ ื›ืœ ืฆื•ืžืช ืืฉื›ื•ืœ ืขื‘ื•ืจ ืจืฉื•ืžื•ืช salesPointCache ื”ื–ืžื™ื ื•ืช ืฉื, ื•ืœืื—ืจ ืžื›ืŸ ืฆื•ืžืช ื”ืœืงื•ื— ื™ื‘ืฆืข ืืช ื”ืกื™ื›ื•ื ื”ืกื•ืคื™.

ืื ื™ ืงื•ืจื ืืช ื”ื”ื“ืจื›ื” ืืคืœื™ืงืฆื™ื™ืช Ignite Compute ื”ืจืืฉื•ื ื”, ืื ื™ ืขื•ืฉื” ืืช ื–ื” ื‘ืื ืœื•ื’ื™ื”. ื‘ื›ืœ ืฆื•ืžืช ืืฉื›ื•ืœ ืื ื™ ืžืจื™ืฅ ืืช IgniteRunnable(), ืžืฉื”ื• ื›ื–ื”:

  @Override
  public void run() {
    SalesPoint sp=salesPointCache.get(spId);
    sp.calculateSalesPointCount();
    ..
  }

ืื ื™ ืžื•ืกื™ืฃ ื”ื™ื’ื™ื•ืŸ ืฆื‘ื™ืจื” ื•ื”ืขืœืื” ื•ืžืคืขื™ืœ ืื•ืชื• ืขืœ ืขืจื›ืช ื ืชื•ื ื™ ื‘ื“ื™ืงื”. ื”ื›ืœ ืขื•ื‘ื“ ื‘ืื•ืคืŸ ืžืงื•ืžื™ ืขืœ ืฉืจืช ื”ืคื™ืชื•ื—.

ืื ื™ ืžืคืขื™ืœ ืฉื ื™ ืฉืจืชื™ ื‘ื“ื™ืงื” CentOs, ืžืฆื™ื™ืŸ ืืช ื›ืชื•ื‘ื•ืช ื”-IP ื‘-default-config.xml, ืžื‘ืฆืข ื‘ื›ืœ ืื—ื“ ืžื”ื

./bin/ignite.sh config/default-config.xml

ืฉื ื™ ืฆืžืชื™ ื”-Ignite ืคื•ืขืœื™ื ื•ื™ื›ื•ืœื™ื ืœืจืื•ืช ื–ื” ืืช ื–ื”. ืื ื™ ืžืฆื™ื™ืŸ ืืช ื”ื›ืชื•ื‘ื•ืช ื”ื ื“ืจืฉื•ืช ื‘ืชืฆื•ืจืช ื”-xml ืฉืœ ื™ื™ืฉื•ื ื”ืœืงื•ื—, ื–ื” ืžืชื—ื™ืœ, ืžื•ืกื™ืฃ ืฆื•ืžืช ืฉืœื™ืฉื™ ืœื˜ื•ืคื•ืœื•ื’ื™ื” ื•ืžื™ื“ ื™ืฉ ืฉื ื™ ืฆืžืชื™ื ืฉื•ื‘. ื”ื™ื•ืžืŸ ืžืฆื™ื’ "ClassNotFoundException: model.SalesPoint" ื‘ืฉื•ืจื”

SalesPoint sp=salesPointCache.get(spId);

StackOverflow ืื•ืžืจ ืฉื”ืกื™ื‘ื” ืœืฉื’ื™ืื” ื”ื™ื ืฉืื™ืŸ ืžื—ืœืงืช SalesPoint ืžื•ืชืืžืช ืื™ืฉื™ืช ื‘ืฉืจืชื™ CentOs. ื”ื’ืขื ื•. ืžื” ื“ืขืชืš ืขืœ "ืื™ื ืš ืฆืจื™ืš ืœืคืจื•ืก ื™ื“ื ื™ืช ืืช ืงื•ื“ ื”-Java ืฉืœืš ื‘ื›ืœ ืฆื•ืžืช" ื•ื›ืŸ ื”ืœืื”? ืื• ืฉ"ืงื•ื“ ื”-Java ืฉืœืš" ืื™ื ื• ืงืฉื•ืจ ืœ-SalesPoint?

ื›ื ืจืื” ืคืกืคืกืชื™ ืžืฉื”ื• โ€“ ืื ื™ ืžืชื—ื™ืœื” ืœื—ืคืฉ ืฉื•ื‘, ืœืงืจื•ื ื•ืฉื•ื‘ ืœื—ืคืฉ. ืœืื—ืจ ื–ืžืŸ ืžื” ื™ืฉ ืœื™ ื”ืจื’ืฉื” ืฉืงืจืืชื™ ื”ื›ืœ ืขืœ ื”ื ื•ืฉื, ืื™ืŸ ื™ื•ืชืจ ื—ื“ืฉ. ื‘ื–ืžืŸ ืฉื—ื™ืคืฉืชื™, ืžืฆืืชื™ ื›ืžื” ื”ืขืจื•ืช ืžืขื ื™ื™ื ื•ืช.

ื•ืœื ื˜ื™ืŸ ืงื•ืœื™ืฆ'ื ืงื•, ืื“ืจื™ื›ืœ ืžื•ื‘ื™ืœ ื‘-GridGain Systems, ืœืขื ื•ืช ื‘-StackOverflow, ืืคืจื™ืœ 2016:

Model classes are not peer deployed, but you can use withKeepBinary() flag
on the cache and query BinaryObjects. This way you will avoid deserialization
on the server side and will not get ClassNotFoundException.

ืขื•ื“ ื“ืขื” ืžื•ืกืžื›ืช: ื“ื ื™ืก ืžื’ื“ื”, ืžื ื”ืœ ื ื™ื”ื•ืœ ืžื•ืฆืจ, GridGain Systems.

ืžืืžืจ ืขืœ Habrรฉ ืขืœ ืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืžืชื™ื™ื—ืก ืœืฉืœื•ืฉื” ืžืืžืจื™ื ืžืืช ื“ื ื™ืก ืžื’ื“ื”: ืฉื™ืจื•ืชื™ ืžื™ืงืจื• ื—ืœืง ื', ืฉื™ืจื•ืชื™ ืžื™ืงืจื• ื—ืœืง ื‘', ืฉื™ืจื•ืชื™ ืžื™ืงืจื• ื—ืœืง ื’' 2016-2017. ื‘ืžืืžืจ ื”ืฉื ื™, ื“ื ื™ืก ืžืฆื™ืข ืœื”ืชื—ื™ืœ ืฆื•ืžืช ืืฉื›ื•ืœ ื“ืจืš MaintenanceServiceNodeStartup.jar. ืืชื” ื™ื›ื•ืœ ื’ื ืœื”ืฉืชืžืฉ ื‘ื”ืฉืงื” ืขื ืชืฆื•ืจืช xml ื•ืฉื•ืจืช ืคืงื•ื“ื”, ืื‘ืœ ืื– ืืชื” ืฆืจื™ืš ืœืฉื™ื ื™ื“ื ื™ืช ืžื—ืœืงื•ืช ืžื•ืชืืžื•ืช ืื™ืฉื™ืช ื‘ื›ืœ ืฆื•ืžืช ืืฉื›ื•ืœ ืคืจื•ืก:

That's it. Start (..)  node using MaintenanceServiceNodeStartup file or pass
maintenance-service-node-config.xml to Apache Ignite's ignite.sh/bat scripts.
If you prefer the latter then make sure to build a jar file that will contain
all the classes from java/app/common and java/services/maintenance directories.
The jar has to be added to the classpath of every node where the service
might be deployed.

ืื›ืŸ, ื–ื”ื•. ื”ื ื” ืžืชื‘ืจืจ, ืœืžื”, ื”ืคื•ืจืžื˜ ื”ื‘ื™ื ืืจื™ ื”ืžืกืชื•ืจื™ ื”ื–ื”!

3.SingleJar

ื“ื ื™ืก ืœืงื— ืืช ื”ืžืงื•ื ื”ืจืืฉื•ืŸ ื‘ื“ื™ืจื•ื’ ื”ืื™ืฉื™ ืฉืœื™, IMHO ื”ื”ื“ืจื›ื” ื”ืฉื™ืžื•ืฉื™ืช ื‘ื™ื•ืชืจ ืžื›ืœ ื”ืงื™ื™ืžื•ืช. ื‘ื• MicroServicesExample Github ืžื›ื™ืœื” ื“ื•ื’ืžื” ืžื•ื›ื ื” ืœื—ืœื•ื˜ื™ืŸ ืœื”ื’ื“ืจืช ืฆืžืชื™ื ืฉืœ ืืฉื›ื•ืœื•ืช, ืฉืžืชื‘ืฆืขืช ืงื•ืžืคื™ืœืฆื™ื” ืœืœื ื›ืœ ื›ืจื™ืขื” ื ื•ืกืคืช.

ืื ื™ ืขื•ืฉื” ืืช ื–ื” ื‘ืื•ืชื• ืื•ืคืŸ ื•ืžืงื‘ืœ ืงื•ื‘ืฅ jar ื‘ื•ื“ื“ ืฉืžืคืขื™ืœ "ืฆื•ืžืช ื ืชื•ื ื™ื" ืื• "ืฆื•ืžืช ืœืงื•ื—" ื‘ื”ืชืื ืœืืจื’ื•ืžื ื˜ ืฉื•ืจืช ื”ืคืงื•ื“ื”. ื”ื”ืจื›ื‘ื” ืžืชื—ื™ืœื” ื•ืขื•ื‘ื“ืช. ืืคืก ืคืจื™ืกื” ื”ื•ื‘ืกื”.

ื”ืžืขื‘ืจ ืžืžื’ื”-ื‘ื™ื™ื˜ ืฉืœ ื ืชื•ื ื™ ื‘ื“ื™ืงื” ืœืขืฉืจื•ืช ื’ื™ื’ื”-ื‘ื™ื™ื˜ ืฉืœ ื ืชื•ื ื™ ืœื—ื™ืžื” ื”ืจืื” ืฉื”ืคื•ืจืžื˜ ื”ื‘ื™ื ืืจื™ ืงื™ื™ื ืžืกื™ื‘ื” ื›ืœืฉื”ื™. ื”ื™ื” ืฆื•ืจืš ืœื™ื™ืขืœ ืืช ืฆืจื™ื›ืช ื”ื–ื™ื›ืจื•ืŸ ื‘ืฆืžืชื™ื, ื•ื›ืืŸ ื”ืชื‘ืจืจ ื›ื™ BinaryObject ื”ื™ื” ืฉื™ืžื•ืฉื™ ืžืื•ื“.

4. ืžืกืงื ื•ืช

ื”ืชื•ื›ื—ื” ื”ืจืืฉื•ื ื” ืฉื ืชืงืœื” ื‘ืขื ื™ื™ืŸ ื”ืขืžื™ืžื•ืช ืฉืœ ืชื™ืขื•ื“ ืคืจื•ื™ืงื˜ Apache Ignite ื”ืชื‘ืจืจื” ื›ื”ื•ื’ื ืช; ืžืขื˜ ื”ืฉืชื ื” ืžืื– 2016. ืœื ืงืœ ืœืžืชื—ื™ืœื™ื ืœื”ืจื›ื™ื‘ ืื‘ ื˜ื™ืคื•ืก ืžืชืคืงื“ ืขืœ ื‘ืกื™ืก ืืชืจ ื•/ืื• ืžืื’ืจ.

ื‘ื”ืชื‘ืกืก ืขืœ ืชื•ืฆืื•ืช ื”ืขื‘ื•ื“ื” ืฉื ืขืฉืชื”, ื”ืจื•ืฉื ื”ื™ื” ื›ื™ Zero Deployment ืขื•ื‘ื“, ืืš ืจืง ื‘ืจืžืช ื”ืžืขืจื›ืช. ืžืฉื”ื• ื›ืžื• ื–ื”: BinaryObject ืžืฉืžืฉ ื›ื“ื™ ืœืœืžื“ ืฆืžืชื™ื ืžืจื•ื—ืงื™ื ืฉืœ ืืฉื›ื•ืœื•ืช ืœืขื‘ื•ื“ ืขื ืžื—ืœืงื•ืช ืžื•ืชืืžื•ืช ืื™ืฉื™ืช; ืืคืก ืคืจื™ืกื” - ืžื ื’ื ื•ืŸ ืคื ื™ืžื™
Apache Ignite ืขืฆืžื• ื•ืžืคื™ืฅ ืื•ื‘ื™ื™ืงื˜ื™ ืžืขืจื›ืช ื‘ืจื—ื‘ื™ ื”ืืฉื›ื•ืœ.

ืื ื™ ืžืงื•ื•ื” ืฉื”ื ื™ืกื™ื•ืŸ ืฉืœื™ ื™ื”ื™ื” ืฉื™ืžื•ืฉื™ ืœืžืฉืชืžืฉื™ Apache Ignite ื—ื“ืฉื™ื.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”