avatarJoel Fukuzawa

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

5243

Abstract

name">C</span>:\Users\feng\Kafka\kraft>ls docker-compose.yml <span class="hljs-name">C</span>:\Users\feng\Kafka\kraft>docker-compose up -d [+] Running <span class="hljs-number">2</span>/<span class="hljs-number">2</span>

  • Network kraft_default Created <span class="hljs-number">0.0</span>s
  • Container kraft-kafka<span class="hljs-number">-1</span> Started

<span class="hljs-name">C</span>:\Users\feng\Kafka\kraft>docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES <span class="hljs-number">54342e49</span>a1f2 bitnami/<span class="hljs-name">kafka</span>:latest <span class="hljs-string">"/opt/bitnami/script…"</span> <span class="hljs-number">18</span> seconds ago Up <span class="hljs-number">17</span> seconds <span class="hljs-number">0.0</span><span class="hljs-number">.0</span><span class="hljs-number">.0</span>:<span class="hljs-number">9092</span>-><span class="hljs-number">9092</span>/tcp kraft-kafka<span class="hljs-number">-1</span> <span class="hljs-number">0.5</span>s</pre></div><h2 id="095a">1.5 Create Kafka topic</h2><p id="0672">We’ll login to the instance and create a test topic in Kafka</p><div id="aaf2"><pre><span class="hljs-comment">## Login to Kafka docker instance</span> C:\Users\feng\Kafka\kraft>docker exec -it kraft-kafka-1 <span class="hljs-string">/bin/bash</span> <span class="hljs-keyword">cd</span> <span class="hljs-string">/opt/bitnami/kafka</span> <span class="hljs-string">/opt/bitnami/kafka</span> <span class="hljs-string">./bin/kafka-topics.sh</span> <span class="hljs-params">--version</span> 3.4.0 <span class="hljs-params">(Commit:2e1947d240607d53)</span>

<span class="hljs-comment">## Create topic named "test_topic"</span> <span class="hljs-string">/opt/bitnami/kafka</span>$ <span class="hljs-string">./bin/kafka-topics.sh</span> <span class="hljs-params">--bootstrap-server</span> localhost<span class="hljs-function">:9092</span> <span class="hljs-params">--create</span> <span class="hljs-params">--replication-factor</span> 1 <span class="hljs-params">--partitions</span> 2 <span class="hljs-params">--topic</span> test_topic WARNING: Due to limitations in metric names, topics with a period <span class="hljs-params">('.')</span> or underscore <span class="hljs-params">('_')</span> could collide. To avoid issues it is best to use either, but not both. Created topic test_topic.

<span class="hljs-comment">## List current topics</span> <span class="hljs-string">/opt/bitnami/kafka</span>$ <span class="hljs-string">./bin/kafka-topics.sh</span> <span class="hljs-params">--bootstrap-server</span> localhost<span class="hljs-function">:9092</span> <span class="hljs-params">--list</span> test_topic</pre></div><p id="8304">So by now we have a Kafka docker instance running successfully.</p><h1 id="80ee">2 Run sanity checks using simple producer/consumer app codes</h1><h2 id="b504">2.1 Setup producer/consumer Dev ENV</h2><div id="8e5b"><pre>## Create conda env <span class="hljs-keyword">for</span> Kafka producer <span class="hljs-keyword">and</span> cosumer <span class="hljs-name">C</span>:\Users\feng\Kafka\kraft>conda create -n kafka_env python=<span class="hljs-number">3.10</span> ... <span class="hljs-name">C</span>:\Users\feng\Kafka\kraft>conda activate kafka_env

Install kafka-python <span class="hljs-built_in">package</span>

(kafka_env) <span class="hljs-name">C</span>:\Users\feng\Kafka\kraft>pip install kafka-python ... (kafka_env) <span class="hljs-name">C</span>:\Users\feng\Kafka\kraft>pip list | grep kafka kafka-python <span class="hljs-number">2.0</span><span class="hljs-number">.2</span>

Install Faker <span class="hljs-built_in">package</span> to generate dummy messages

(kafka_env) <span class="hljs-name">C</span>:\Users\feng\Kafka\kraft>pip install Faker ... (kafka_env) <span class="hljs-name">C</span>:\Users<span class="hljs-number">6119811</span>\Kafka\kraft>pip list | grep Faker Faker <span class="hljs-number">17.3</span><span class="hljs-number">.0</span></pre></div><h2 id="6701">2.2 Code examples</h2><p id="c7dc">Now we can use VSCode to create producer/consumer files.</p><p id="fc6a">Producer generate fake user info as JSON load sending to Kafka topic “test_topic”. producer.py is like following.</p><div id="8801"><pre><span class="hljs-keyword">import</span> time <span class="hljs-keyword">import</span> json <span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> datetime <span class="hljs-keyword">from</span> kafka <span class="hljs-keyword">import</span> KafkaProducer <span class="hljs-keyword">from</span> faker <span class="hljs-keyword">import</span> Faker

<span class="hljs-comment"># JSON messages needs to be serialized</span> <span class="hljs-comment"># when sending to Kafka topic </span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">json_serializer</span>(<span class="hljs-params">message</span>): <span class="hljs-keyword">return</span> json.dumps(message

Options

).encode(<span class="hljs-string">'utf-8'</span>) <span class="hljs-comment"># Kafka Producer</span> producer = KafkaProducer( bootstrap_servers=[<span class="hljs-string">'localhost:9092'</span>], value_serializer=json_serializer ) <span class="hljs-keyword">if</span> name == <span class="hljs-string">'main'</span>: fake = Faker() <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">0</span>, <span class="hljs-number">3</span>): <span class="hljs-comment"># Generate a fake JSON message</span> name = fake.name() email = fake.email() city = fake.city() fake_message = { <span class="hljs-string">"name"</span>: name, <span class="hljs-string">"email"</span>: email, <span class="hljs-string">"city"</span>: city }

    <span class="hljs-comment"># Send fake JSON message to Kafka topic</span>
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f'<span class="hljs-subst">{datetime.now()}</span>: Message = <span class="hljs-subst">{<span class="hljs-built_in">str</span>(fake_message)}</span>'</span>)
    producer.send(<span class="hljs-string">'test_topic'</span>, fake_message)
                                                          
    time.sleep(<span class="hljs-number">1</span>)</pre></div><p id="6594">And here is our consumer.py</p><div id="a19b"><pre><span class="hljs-keyword">import</span> json 

<span class="hljs-keyword">from</span> kafka <span class="hljs-keyword">import</span> KafkaConsumer

<span class="hljs-keyword">if</span> name == <span class="hljs-string">'main'</span>: <span class="hljs-comment"># Kafka Consumer</span> consumer = KafkaConsumer( <span class="hljs-string">'test_topic'</span>, bootstrap_servers=<span class="hljs-string">'localhost:9092'</span>, auto_offset_reset=<span class="hljs-string">'earliest'</span> ) <span class="hljs-keyword">for</span> message <span class="hljs-keyword">in</span> consumer: <span class="hljs-built_in">print</span>(json.loads(message.value))</pre></div><p id="8d09">OK, now let’s start consumer and run producer to send some fake message for a sanity check.</p><div id="572f"><pre><span class="hljs-comment"># Run producer</span> (kafka_env) C:\Users\feng\Kafka\kraft>python producer.py 2023-02-25 18:48:41.143953: Message = {<span class="hljs-string">'name'</span>: <span class="hljs-string">'Susan Best'</span>, <span class="hljs-string">'email'</span>: <span class="hljs-string">'[email protected]'</span>, <span class="hljs-string">'city'</span>: <span class="hljs-string">'Kellytown'</span>} 2023-02-25 18:48:42.160545: Message = {<span class="hljs-string">'name'</span>: <span class="hljs-string">'James Wilson'</span>, <span class="hljs-string">'email'</span>: <span class="hljs-string">'[email protected]'</span>, <span class="hljs-string">'city'</span>: <span class="hljs-string">'Lake Bryanfort'</span>} 2023-02-25 18:48:43.177933: Message = {<span class="hljs-string">'name'</span>: <span class="hljs-string">'Haley Brooks'</span>, <span class="hljs-string">'email'</span>: <span class="hljs-string">'[email protected]'</span>, <span class="hljs-string">'city'</span>: <span class="hljs-string">'East Janetburgh'</span>}

<span class="hljs-comment"># Monitor consumer</span> (kafka_env) C:\Users\feng\Kafka\kraft>python consumer.py {<span class="hljs-string">'name'</span>: <span class="hljs-string">'Susan Best'</span>, <span class="hljs-string">'email'</span>: <span class="hljs-string">'[email protected]'</span>, <span class="hljs-string">'city'</span>: <span class="hljs-string">'Kellytown'</span>} {<span class="hljs-string">'name'</span>: <span class="hljs-string">'James Wilson'</span>, <span class="hljs-string">'email'</span>: <span class="hljs-string">'[email protected]'</span>, <span class="hljs-string">'city'</span>: <span class="hljs-string">'Lake Bryanfort'</span>} {<span class="hljs-string">'name'</span>: <span class="hljs-string">'Haley Brooks'</span>, <span class="hljs-string">'email'</span>: <span class="hljs-string">'[email protected]'</span>, <span class="hljs-string">'city'</span>: <span class="hljs-string">'East Janetburgh'</span>}</pre></div><p id="3143">Great, our Kafka Docker instance and simple applications are working as expected!</p><p id="79d6">Happy Reading!</p><div id="2213" class="link-block"> <a href="https://medium.com/@fengliplatform/membership"> <div> <div> <h2>Join Medium with my referral link - Feng Li</h2> <div><h3>Writing helps ourselves, sharing helps many. It started from study notes for myself with no pressure of perfection…</h3></div> <div><p>medium.com</p></div> </div> <div> <div style="background-image: url(https://miro.readmedium.com/v2/resize:fit:320/0*K9psL5RefQfuKkzr)"></div> </div> </div> </a> </div></article></body>

在中國宣告失敗的共享雨傘 為什麼能在日本欣欣向榮?

「共享經濟」在中國不再像前幾年那麼閃閃發光,共享汽車、共享單車、共享公寓到共享雨傘,紛紛傳出破產或是轉型。不過在中國被證明失敗的共享雨傘,最近卻在日本意外的發展起來,不但日本最大的鐵路運輸系統 JR 東日本宣布投入資金共同營運,服務範圍還從東京擴大到福岡等日本其他城市,為什麼在中國失敗的商業模式卻在日本可以閃閃發光?有人把這歸結到民族性,或許太過簡單粗暴。中國共享雨傘失敗經驗的前車之鑑,應該才是讓日本共享雨傘可以躲開許多障礙的最大因素。

iKasa 不自設 APP 透過 Line 好友就能完成租借

日本的共享雨傘 iKasa 使用模式很簡單,只要在常用的通訊軟體 Line 上加入 iKasa 好友,就可以通過掃 QR-Code 的方式取得雨傘的開鎖密碼,歸還的時候把雨傘收好放回固定的傘架,掃描傘架上的歸還 QR-Code 就可以。租借不用繳付押金,一天的使用費是 70 日圓、一個月 420 日圓,如果租借超過 6 天等於一整個月都可以免費使用這把雨傘,如果真的喜歡的話,一把雨傘的售價是 840 日圓。這些結算費用都會透過 Line 電子支付系統直接扣款,所以對消費者來說,並沒有太多使用上的門檻。

共享 e 傘手續繁瑣 遠水救不了近火

反過來看中國的共享 e 傘的借用模式,必須要先下載專屬 APP 接著要透過實名認證、帳戶連結以及繳付押金等等程序才能正式開通使用,光從這一個部分就可以來想像一個場景:會想要使用共享雨傘的消費者,應該是突然之間下雨卻忘了雨傘的人,如果他還必須透過這些繁瑣的認證程序之後才能使用雨傘,究竟有多少人會有耐心持續完成所有動作,很值得商榷。再加上這些共享雨傘就像中國的共享單車一樣,大都不設置專屬傘架,採取的是髓手可借隨手可還的「便利性」,這不但影響城市市容,或許也是歸還率無法拉高的另外一個因素。

中國的共享在賣傘 日本的共享賣的是服務

日本的共享雨傘與中國的共享雨傘從表面上看來大同小異,但是在商業模式上有著本質的不同。中國共享雨傘的運營商本身提供服務給消費者,為了承擔營運成本必須要透過消費者預繳押金的方式,才可能降低風險,但是這也形成了一個弔詭的怪圈,從共享 e 傘創始人趙書平的一段訪談看得出來:「我們的產品(共享雨傘)不一樣,流通的方式也不一樣,雨傘,老百姓就是要藏在家裡,我才有錢賺。」所以一把共享 e 傘押金訂在 19 元人民幣~ 59 元人民幣不等,中國的共享雨傘與其說是「共享」不如說是在「賣傘」。

鐵道交通系通樂於合作 解決乘客遇雨發愁的窘境

但是日本的共享雨傘卻是運營商透過第三方提供給消費者的一項「服務」,先從與 Line 的合作看起, iKasa 把所有的營運掛在 Line 的帳號之下,等於透過 Line 提供了 Line User 一個生活便利的服務,加上 Line 的電子支付系統也已經趨於完備,使用者不用另外繳交押金,就可以使用,營運商也不用擔心雨傘遺失或是佔為己有的問題。接著 iKasa 又積極地與日本各大鐵道交通系統合作,對於生活在日本都會區的人來說,車站是生活與工作的重要節點,把共享雨傘的取用歸還設置在車站站內,不但提供給鐵道公司一個嶄新的服務,同時也方便了出站之後考慮究竟是要買一把百元的塑膠傘還是淋著雨出站的消費者不一樣的選擇。日本的共享雨傘不但提供了消費者生活便利,也能透過與廠商的合作,發揮更大效益形成三贏的態勢。

提高消費者認同 異業結盟才是獲利的根本

Nature Innovation Group社長丸川照司說:「現在不但有鐵道公司,還有一些博物館、美術館主動來找我們異業結盟,他們甚至表示願意出資設置借傘點」丸川繼鐵道公司之後,現在正積極向這些便利超商推銷 iKasa 的服務,從今年二月開始 iKasa 也已經在日本三大便利連鎖店 Lawson 的部分店舖設置「借傘點」。如果丸川這套模式在日本成功了,對於每年要消費 8,000 萬把塑膠傘的日本來說,或許也是一個減塑的好題材。

福澤喬,帶你從縱深潛入去認識日本這個鄰居。
當了十幾年的記者,希望做的事情就是用文字、影像去傳達心中的一些想法。
如果喜歡這篇文章也請讓我知道,同時歡迎Follow
這是讓我調整寫作方向的做法。
日本
中文
Japan
Business
Sharing Economy
Recommended from ReadMedium