「從零單排canal 03」 canal源碼分析大綱

在前面兩篇中,我們從基本概念理解了canal是一個什麼項目,能應用於什麼場景,然後通過一個demo體驗,有了基本的體感和認識。

從這一篇開始,我們將從源碼入手,深入學習canal的實現方式。了解canal相關功能的實現方式,其中有很多機制是非常值得深入了解的,從代碼實現角度去學習實時數據訂閱與同步的實現與核心技術點。當然,如果要在生產中使用這個開源項目,了解源碼更是必不可少,是解決問題和新特性定製的前提條件。

本文使用的版本是1.1.4,這也是筆者寫這篇博客時的最新穩定版。

1.準備工作

下載源碼

git clone https://github.com/alibaba/canal.git

切換到1.1.4這個tag

git checkout canal-1.1.4

 

或者可以關注我的源碼註釋版本(正在不斷更新中)
https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal

2.canal項目模塊介紹

canal項目是基於maven構建的,將不同的功能模塊劃分了不同的子模塊。

我們可以簡單執行可執行模塊deployer,也可以將模塊通過maven依賴的方式,將你需要的子模塊引入到你自己的項目中進行使用開發。

 

簡單介紹下核心模塊的功能:

  • deployer模塊:獨立部署模塊,用於canal-server的獨立啟動,包括本地配置解析、拉取遠程配置、啟動canal-server。
  • server模塊:canal-server的實現邏輯,一個canal-server一般是一個jvm進程。重點關注兩種canal-server的實現方式,內嵌型的canalServerEmbed和獨立使用的canalServerWithNetty。新版本中新增了直接對接mq的canal-server實現。
  • instance模塊:具體實時訂閱任務是由一個個instance組成的,每個canal-server中可以同時運行多個instance。instance由parser、sink、store三個重點模塊組成。
  • parser模塊:數據源接入,模擬slave協議和master進行交互,協議解析。parser模塊依賴於dbsync、driver模塊。
  • sink模塊:將parser抓取到的數據,進行過濾,加工,然後發送到store模塊進行存儲。核心接口為CanalEventSink。
  • store模塊:數據存儲模塊,類似內存模式到消息隊列,本質上是一個RingBuffer。核心接口為CanalEventStore。
  • meta模塊:增量訂閱&消費信息管理器,核心接口為CanalMetaManager,主要用於記錄canal消費到的mysql binlog的位置
  • client模塊:項目最早的消費客戶端,通過將client模塊引入自己的項目中,然後直接消費canal-server獲取的數據。
  • client-adapter模塊:1.1.x后新出的模塊,可以獨立部署為canal-server的消費服務端,是一個springboot項目。通過SPI機制,能夠加載不同plugins,將消費信息投遞到ES\hbase\rdb等下游。
  • admin模塊:1.1.x新出的模塊,可以獨立部署為canal-server的控制台,配置canal-server、instance相關配置,非常好用。

3.模塊關聯

那這些模塊之間是如何組織、如何關聯的呢?

我們從整體到局部來看一下。

整體架構關聯,包括admin模塊、server模塊、client-adapter模塊

 

1)server模塊是服務端核心模塊,用來拉取binlog的實時變更,然後投遞到客戶端。

2)server可以通過配置,選擇投遞到MQ,或者是啟動一個netty,讓客戶端來拉取。

3)client-adapter就是一個獨立部署到服務,可以直接拉取canal-server的消息(或者拉取mq的消息),轉發到對應RDS/Redis/HBase,當然,你也可以自己實現一個轉發到redis的adapter

4)admin模塊是管理控制台,可以調度canal-server組成一個個集群實現instance的高可用、可以更改server、instance的配置信息。

Canal-server模塊局部關係,包括deployer模塊、server模塊、instance模塊、parser模塊、sink模塊、store模塊、meta模塊、client模塊。

 

1)deployer模塊是一個啟動模塊,可以啟動canal-server。

2)一個server是一個獨立應用,是一個jvm進程,裏面可以有多個instance對象。

3)instance內包括了parser、sink、store、meta

4)parser負責獲取binlog變更,然後sink將parser獲取的binlog變更轉換為event,存入store。

5)meta是元信息管理器

6)client模塊可以內嵌入你的應用,用來消費canal-server的消息事件。

基本上核心模塊的關係就是這樣了,後續會按照模塊的維度進行源碼分析,敬請期待。

 

都看到最後了,原創不易,點個關注,點個贊吧~

文章持續更新,可以微信搜索「阿丸筆記 」第一時間閱讀,回復關鍵字【學習】有我準備的一線大廠面試資料。

知識碎片重新梳理,構建Java知識圖譜: github.com/saigu/JavaK…(歷史文章查閱非常方便)

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

新北清潔公司,居家、辦公、裝潢細清專業服務

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

自動化測試實戰技巧:「用例失敗重試機制」實現方案分享

1. 背景說明

在開展自動化測試工作時,經常會由於一些外在原因(如網絡中斷、返回超時)導致自動化測試用例運行失敗,而這些失敗並不是用例本身驗證或被測程序存在Bug而引起的,更可氣的是這些失敗場景有可能還是偶發的,為了保證測試用例運行的穩定性驗證有效性,我們需要一種針對失敗用例重試的運行機制。

今天給大家分享的主題:自動化測試工作中,用例腳本失敗重試機制的實現方式。

結合自動化測試框架來講,用例運行失敗重試機制,通常有三種形式來實現:

  • 藉助依賴框架自身是否有用例失敗重試運行機制。

  • 從用例腳本自身邏輯處入手,實現失敗運行重試。(適用於被特殊處理過的用例邏輯)

  • 從擴展框架源碼,自定義失敗重試運行機制。(通常適合於所有失敗用例)

接下來,我們以Robot Framework框架為例,以具體的實戰示例項目介紹如何實現用例失敗重試機制。

2. 示例項目環境搭建

為了便於演示,重新創建一套新的虛擬隔離環境,用於搭建Robot Framework框架,操作步驟如下。

1、創建虛擬環境robotframework_env

python3 -m venv robotframework_env

2、激活虛擬環境

cd robotframework_env
source bin/activate

3、在虛擬環境中,安裝robotframework、robotframework-ride庫(安裝最新即可)。

pip install robotframework
pip install robotframework-ride

如下圖所示:

4、 輸入命令:bin ./ride.py啟動RIDE,如下圖所示。

PS: 其它三方庫演示項目中,暫不需要,讀者可根據實際需求,自行安裝。

3. 創建實戰示例項目

1、 創建trainning演示項目,並在項目下,創建失敗重試機制實戰目錄,並依次創建測試套件、測試用例,示例結構如下:

2、 編寫測試用例,測試用例邏輯如下:

*** Settings ***
Library           Collections

*** Test Cases ***
Class_01_隨機取數,模擬隨機出現失敗場景
    @{list}=    create list    1    2    3
    ${random_num}=    Evaluate    random.choice(${list})    random
    log    ${random_num}
    should be true    ${random_num}==2
  • 在測試用例中,先通過create list關鍵字創建了一個名稱為${list}的列表變量,並依次存入1、2、3三個元素。
  • 再通過Evaluate萬能關鍵字,結合random.chocie方法,從${list}列表中隨機取出一個整型元素,保存到名稱為${random_num}變量中。
  • 最後,通過should be true關鍵字,斷言${random_num}變量等於2,由於第二步的隨機取值,會讓${random_num}變量值具有隨機性(可能等於2,也可能是1或3),從而實現模擬一條隨機失敗的用例場景。

運行成功結果:

運行失敗結果:

4. 用例失敗重試機制實現

Robot Framework 官方並沒有提供類似retry等參數來配置失敗用例重執行。僅僅提供了--rerunfailed參數對基於結果文件output.xml來選擇重新執行失敗的用例。

4.1 基於RF框架自身的重試機制

1、 以第3節中新建的示例項目為例,為了便於演示,以命令行來操作,在命令行中輸入執行用例命令,並且將輸出文件保存到original.xml文件中。

robot --output original.xml .

2、 重新運行測試用例,並將第二次運行的結果文件輸出保存到rerun.xml文件中。

robot --output rerun.xml --rerunfailed original.xml .

3、合併兩次運行的結果輸出文件。

rebot --merge original.xml rerun.xml

在Robot Framework中除了有--rerunfailed參數針對失敗的測試用例外,也有針對測試套件的--rerunfailedsuites,參數詳細說明如下:

-R --rerunfailed output  Select failed tests from an earlier output file to be
                          re-executed. Equivalent to selecting same tests
                          individually using --test option.

------------------------------------------------
 -S --rerunfailedsuites output  Select failed suite from an earlier output file
                          to be re-executed. New in RF 3.0.1.

  • -R--rerunfailed參數非常有用,它的作用是從output file中選擇失敗的用例重跑。但是有個問題,如果上一次運行時用例全部成功,此時加上-R參數再去運行用例時會報錯: failed: All tests passed ,這導致我沒辦法在jenkins job中使用這個參數。

  • -S--rerunfailedsuites參數和-R參數的作用類似,它的作用是從output file中選擇失敗的用例套件重跑。

4.2 基於用例腳本邏輯重試機制

第二種方法,我們介紹,如何基於用例腳本邏輯特殊改造,實現用例失敗后的重試機制。

基於用例邏輯增加重試機制,核心實現思路:基於RF內置變量${TEST_STATUS}獲取用例運行結果,再結合Teardown運行改造后的關鍵字邏輯即可。

操作如下:

1、對示例1中的Class_01 測試用例進行改造,抽取用例邏輯部分,存放到單獨的關鍵字下,名稱如測試用例關鍵字

*** Keywords ***
測試用例關鍵字
    @{list}=    create list    1    2    2
    ${random_num}=    Evaluate    random.choice(${list})    random
    log    ${random_num}
    should be true    ${random_num}==2

2、 添加關鍵字用例重試機制,增加用例重試機制的處理邏輯:

*** Keywords ***
用例重試機制
    [Arguments]    ${times}
    ${status}=    set variable    ${TEST STATUS}
    FOR    ${index}    IN RANGE    ${times}
        log    第${index+1}運行結果: ${status}
        Exit For loop if    '${status}'=='PASS' or '${status}'=='True'
        log    第${index+1}次重試運行
        ${status}=    Run keyword And Return Status    測試用例關鍵字
    END

用例重試機制關鍵字中,先通過${TEST STATUS}內置變量,獲取用例執行結果,並且接收變量${times}用於控制重試次數,如果用例執行狀態等於PASS則直接退出重試,否則調用Run keyword And Return Status關鍵字繼續運行測試用例。

3、為了便於演示,增加一條名稱為Class_02測試用例,內容如下:

Class_02_隨機取數,模擬隨機出現失敗場景
    測試用例關鍵字
    [Teardown]    run keyword    用例重試機制    5

到此, 我們已經在用例邏輯層面實現了用例失敗重試機制了。

PS: 針對用例邏輯層面實現重試機制,也可以採用關鍵字: Wait Until Keyword Succeeds,讀者可根據自身需求進行改造,本文的用例重試機制並不是唯一的方法。

4.3 基於框架源碼實現重試機制

除了上述兩種方法,最後一種方法是基於框架層面進行改造,增加全局重試機制,

通過改寫Robot Framework源代碼增加--retry選項,實現test級別的失敗用例自動再執行,比如用例失敗后,會重新運行N次,直至成功or 耗盡重試次數,生成的日誌和報告文件中只會體現最後一次執行的結果。

類似如下命令格式:

robot --retry 3 trainning

具體實現:

1、修改文件 : robotframework_env/lib/python3.7/site-packages/robot/run.py,在USAGE變量里添加retry參數。

 -F --extension value     Parse only files with this extension when executing
                          a directory. Has no effect when running individual
                          files or when using resource files. If more than one
                          extension is needed, separate them with a colon.
                          Examples: `--extension txt`, `--extension robot:txt`
                          New in RF 3.0.1. Starting from RF 3.2 only `*.robot`
                          files are parsed by default.
 -N --name name           Set the name of the top level suite. By default the
                          name is created based on the executed file or
                          directory.
 -H --retry retry     Set the retry times if test failed.

2、在run.py文件,RobotFramework類增加make方法,並在開始之前導入庫from xml.dom import minidom

def make(self, outxml):
        xmldoc = minidom.parse(outxml)
        suiteElementList = xmldoc.getElementsByTagName('suite')
        mySuite = []
        for suiteElement in suiteElementList:
            if suiteElement.childNodes is not None:
                for element in suiteElement.childNodes:
                    if element.nodeName == 'test':
                        mySuite.append(suiteElement)
                        break
        for suite in mySuite:
            testElements = {}
            for element in suite.childNodes:
                if element.nodeName == 'test':
                    name = element.getAttribute('name')
                    if testElements.get(name) == None:
                        testElements.update({name: [element]})
                    else:
                        testElements.get(name).append(element)
            for n, el in testElements.items():
                for i in el[0:-1]:
                    textElement = i.nextSibling
                    suite.removeChild(i)
                    suite.removeChild(textElement)
        savefile = open(outxml, 'w')
        root = xmldoc.documentElement
        root.writexml(savefile)
        savefile.close()

3、RobotFramework類的main方法,加入紅色內容 self.make(settings.output)

4、 打開robot/conf/setting.py文件,修改_cli_opts字典,增加'Retry': ('retry', 3),,如下所示:

5、打開robot/model/itemlist.py文件,修改visit方法:

    def visit(self, visitor):
        for item in self:
            if self.__module__ == 'robot.model.testcase' and hasattr(visitor, "_context"):
                testStatus = ''
                for i in range(0, int(visitor._settings._opts['Retry'])):
                    if testStatus != 'PASS':
                        if item.name in visitor._executed_tests:
                            visitor._executed_tests.pop(item.name)
                        item.visit(visitor)
                        testStatus = visitor._context.variables['${PREV_TEST_STATUS}']
                    else:
                        break
            else:
                item.visit(visitor)

6、做完如上配置之後,我們來驗證一下參數是否配置成功了,輸入robot —help查看一下配置參數項。

7、 輸入如下命令,結合Class_01用例,驗證用例失敗重試機制:

robot --test Class_01_隨機取數,模擬隨機出現失敗場景 --retry 3 .

如果測試用例運行結果為PASS,運行一次即正常結束,如果用例運行失敗,則會重試3次執行。

5. 小結

本文以Robot Framework框架為例,介紹了在自動化測試過程中,如何實現用例腳本失敗重試機制,並且分享了三類實現思路:

  • 藉助依賴框架自身是否有用例失敗重試運行機制。

  • 從用例腳本自身邏輯處入手,實現失敗運行重試。(適用於被特殊處理過的用例邏輯)

  • 從擴展框架源碼,自定義失敗重試運行機制。(通常適合於所有失敗用例)

認真品味本文的讀者,會發現,雖然本文內容是以Robot Framework框架為例,但其實任何自動化測試框架,要實現測試用例腳本重試機制,都繞不開本文所提到的三類實現方式思路。學會變通、靈活運用才是王道

希望對大家在實施自動化測試工作當中有所幫助或啟發!如果覺得有用,不用以身相許,關注一下就行

原文傳送門: 原文閱讀

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

新北清潔公司,居家、辦公、裝潢細清專業服務

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化

CPU明明8個核,網卡為啥拚命折騰一號核?

中斷機制

我是CPU一號車間的阿Q,我又來了!

我們日常的工作就是不斷執行代碼指令,不過這看似簡單的工作背後其實也並不輕鬆。

咱不能悶着頭啥也不管一個勁的只管執行代碼,還得和連接在主板上的其他單位打交道。經常保持聯繫的有鍵盤、鼠標、磁盤,哦對,還有網卡,這傢伙最近把我惹到了,待會再說這事兒。

原以為內存那傢伙已經夠慢的了,沒想到跟上面這幾位通個信比他更慢,咱CPU工廠的時間一刻值千金,不能幹等着,耽誤工夫。後來廠里一合計,想了個叫中斷的辦法。

在我們車間裝了個大燈,這些單位想聯繫我們辦事兒,就先給我們發一个中斷信號,大燈就會自動亮起。我們平時工作執行代碼指令的時候,每執行一條指令就會瞅一眼看看大燈有沒有亮起來。一旦發現燈亮了,就把手頭的工作先放一邊,去處理一下。

我們記性很差的,等會處理了完了還得回來接着原來的活繼續干,為了等會回來還能接的起來,走之前得把當前執行的這個線程的各個寄存器的值,執行到哪裡了等等這些信息都保存在這個線程的棧里去。

不過有時候我們在執行非常重要的事情的時候,就不想被他們打斷。於是我們又在車間里那個eflags寄存器中設置了一個標記,如果是1我們才允許被打斷,如果是0那就算天王老子找我們也不管了。

哦不對,還有一種不可以屏蔽的中斷NMI,走得是綠色通道。不過我可不期望有這種事情發生,因為一般都沒有好事,不是電源斷電就是溫度過高,或者總線出了錯誤等這之類嚴重的事情。

8259A PIC

還有一個問題,找我們辦事兒的單位有很多,我們得要區分開來,到底是誰來消息了,而且要是他們一起來找,按什麼樣優先級順序處理,也是一件頭疼的事情。

為此,廠里單獨組建了一個全資的子公司來負責這事兒,他就是可編程中斷控制器PIC,外號8259A,其他單位想聯繫我們都得通過這個PIC,我們只需要和PIC進行對接就可以了。

我們給辦事單位都分配了一個編號,叫做中斷向量。我們還準備了一個表格叫中斷描述符表IDT,表格里記錄了很多信息,其中就有處理這个中斷號對應的函數地址。我們找PIC拿到編號后就執行處理函數就OK了。

這個表格有點大,足足有256項,咱CPU車間空間有限,放不下,就把它放在內存那傢伙那裡了,為了能快速找到這個表,專門添置了一個叫idtr的寄存器指向這個表格。

其實除了中斷,我們在執行指令的時候如果遇到了異常情況,也會去這個表裡執行異常處理函數,最常見的比如遇到了除數是0,內存地址錯誤等等情況。

這種情況下,我們必須主動放下手裡的活,去處理異常,所以我們也說異常是同步的,而中斷不知道什麼時候發生,所以是異步的。

APIC

8259A乾的挺不錯的,不過後來咱們廠擴大規模,從單核CPU變成了多核,他就有點應付不過來了。

終於有一天,廠里召開會議,把8259A給撤了,成立了一個新的全資子公司叫高級可編程中斷控制器APIC,名字就多了個高級兩個字,乾的活還是一樣的。

不過你還別說,這兩個字還真不是吹噓,比8259A不知道高到哪裡去了。

這個APIC的新公司一上台,就成立了兩個部門,一個叫I/O APIC,負責接待那些要找我們辦事兒的單位,一個叫Local APIC,以外包的形式入駐到我CPU的各個車間工作,因為就挨着我們辦公,所以取名叫Local。

I/O APIC收到中斷信號以後,根據自己的策略就分發到對應的Local APIC,咱們八個車間就可以專心處理了,為我們省了不少事兒。

不僅如此,通過這個外包團隊,我們八個車間還能向彼此發起中斷請求,我們把這個叫做處理器間中斷Inter-Processor Interrupt,簡稱IPI

中斷親和性

每當網絡中有數據包到來,網卡那傢伙就發送一个中斷消息過來,告訴我們去處理。

不過最近不知道怎麼回事,網絡數據量激增。咱們廠里明明有8個車間,他非得一個勁的只給我們發消息,搞得我們手頭的工作老是被打斷,忙得不可開交。

終於,我忍不住了,去找網卡那傢伙理論了一番。不過他告訴我,這也不能怪他,分發給誰處理,那是APIC在負責。

想想也是,回頭我就去了APIC那裡,要求他們分攤一點給別的車間處理。

APIC表示這他們做不了主,得讓廠里來決定。

沒過幾天,廠里開了個會,參會的有各車間代表、APIC負責人,還請了操作系統那邊的相關代表過來。

會上,大家為了此事爭執不休。

二號車間虎子:“阿Q,誰叫你們一號車間是Bootstrap Processor,你們就多辛苦一點嘛”

三號車間代表:“你這話說的不合適,大家是一個Team,要互相幫助!要不這樣,既然有這麼多單位要聯繫我們,咱就分下工,比如一號車間負責網卡,二號負責磁盤,我們三號負責鍵盤,以此類推”

五號車間代表:“你想的倒是挺美哦,鍵盤一天能發多少中斷,網卡一天要發多少中斷,你凈挑輕鬆的干。這樣吧,咱就用隨機分發進行負載均衡你們覺得怎麼樣?”

八號車間代表:“隨機個啥啊,多麻煩,依我看吶咱8個車間就輪流來唄”

這時,領導問操作系統代表有沒有什麼建議。

這代表站起身來,推了推眼鏡說到:“幾位有沒有聽過線程的CPU親和性?”

大家都搖了搖頭,問到:“這是個什麼意思?”

“就是有些線程想綁定在你們之中的某一個核上面執行,不希望一會兒在這個核執行,一會兒在那個核執行”

我接過他的話:“好像是有這麼回事兒,之前有遇到過,有個線程一直被分配到我們一號車間,不過我們對這個不用關心吧,執行誰不是幹活啊,對我們都一個樣”

代表搖了搖頭,“唉,這可不一樣!你們每個核的一二級緩存都是自己在管理,要是換到別的核,這緩存多半就沒用了,又得重新來建立,這換來換去的豈不是瞎耽誤功夫嘛!對於一般的線程他們倒是不關心,但是有些線程執行大量的內存訪問和運算處理,又對性能要求很高的話,那就很在意這個問題了”

我們幾個都恍然大悟,紛紛點頭。

虎子起身問到:“那你們是如何實現這個親和性的呢?這跟我們今天的會議又有什麼關係呢?”

代表繼續回答說到:“我先回答你的第一個問題。線程調度是我們操作系統完成的工作,我們提供了API接口,線程通過調用這些接口表明自己的親和性意願,我們在調度的時候就能按照他們的意願把線程分配給你們來執行。”

代表喝了一口水接着說到:“我再回答你的第二個問題。既然線程可以有親和性,那中斷也可以按照這個思路來分發啊!APIC默認有一套分發策略,但是也提供親和性的設置,可以指定誰哪些核來處理,這樣不用把規矩定死,靈活可變,豈不更好?”

剛說完,會議室門口突然出現一年輕少年,揮手將操作系統代表喚了出去。

接下來,我們詳細討論了這種方案的可行性,最後大家一致決定,就照這麼辦,我們一起提出了一個叫中斷親和性的東西,操作系統那邊提供一個可配置的入口smp_affinity,可以通過設置各處理器核的掩碼來決定中斷交由誰來處理,APIC回去負責落地支持。

有了這套方案,再遇到網絡高峰期,咱們一號車間的壓力就有辦法緩解了。

我們剛剛達成一致,操作系統代表返回會議室,神色凝重的說到:“不好意思各位,操作系統那邊有點事情需要趕回去處理一下,先走一步了”

未完待續······

彩蛋

隨着網卡的一聲中斷,一個新的數據包來到了這片土地。

帝國網絡部新來的年輕人顯然沒有意識到危險的到來······

預知後事如何,請關注後續精彩······

往期TOP5文章

真慘!連各大編程語言都擺起地攤了!

因為一個跨域請求,我差點丟了飯碗

完了!CPU一味求快出事兒了!

哈希表哪家強?幾大編程語言吵起來了!

一個HTTP數據包的奇幻之旅

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

貓狗食用市場的終結? 印尼政府決定禁止買賣貓狗肉

摘錄自2018年8月8日香港01報導

印尼政府在本月初的「全國動物福利協調」作出了重大的決定,禁止狗和貓肉貿易,並且不會再提供供人食用的狗、貓肉的健康證明。

在今年1月,印尼動物保護團體「印尼無狗肉」(DMFI)把一封聯署信交給總統Joko Widodo,該信由90多位國內和國際名人簽署,呼籲採取緊急行動去禁止買賣狗、貓肉。 此外,DMFI的全球請願書也由來自世界各地,超過930,000人簽署。

國際人道對待動物協會主席Kitty Block說:「狗、貓肉貿易是殘酷的行為,不但對人類健康有機會構成威脅,並且在很大程度上推動人們犯罪。因此,我們極度讚揚印尼政府承諾終止狗、貓肉貿易。我們希望這一個舉動能向亞洲其他國家發出強烈信息,例如中國、韓國、印度和越南。」

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

德國傳統電廠熱浪中掙扎 整體供電仍穩定

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

用樹的高度來建築  弗班社區找回古城區的感覺

環境資訊中心特約記者 陳文姿報導

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

【你來報報】國際間廢棄漁具管理與台灣經驗的對話

文:郭柏秀(國立成功大學海洋科技與事務研究所 博士候選人)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

避稅天堂撐腰 牛肉、大豆產業吞噬亞馬遜雨林

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

危及蜜蜂存亡 加國漸禁2款類尼古丁農藥

摘錄自2018年8月16日中央社報導

加拿大政府今天(16日)表示,將逐步限用和水生昆蟲及蜜蜂死亡有關連的2款類尼古丁農藥。環保人士認為這是一大勝利,但對販售殺蟲劑的企業而言卻是最新挫敗。

加拿大衛生署(Health Canada)病蟲害管制局(PMRA)表示,未來三到五年之間將逐步禁止在戶外使用賽速安(Thiamethoxam)及可尼丁(Clothianidin)。

加拿大衛生署這項措施將有90天諮詢期,最後在2019年底做出決定。

加拿大衛生署也計畫在今年底之前做出最終決定,是否逐步禁止第3種的類尼古丁農藥,拜耳生產的益達胺(imidacloprid)。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

※教你寫出一流的銷售文案?

擔心成為新的傾倒場 泰國將禁止電子垃圾進口

摘錄自2018年8月16日中央社報導

環境部一名官員今天(16日)說,泰國將在6個月內禁止進口432種廢棄電子用品。中國今年禁止高科技廢棄物進口以來,泰國成為最新呼應的國家。

泰國下達禁令數週前,區域鄰國越南表示,將停止核發新執照給廢棄物進口,並將取締非法運送廢紙、塑膠和金屬。

泰國環境部一名高級官員今天告訴路透社,禁令涵蓋432種電子廢棄物,從電路板到老舊電視機和收音機零件等等,將在6個月內生效。

他並說,禁令是環境部長素拉薩(Surasak Kanchanarat)昨天主持會議時做成決定。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!